diff --git a/.gitignore b/.gitignore index 9686b93..4c60245 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ compile_commands.json /minishell_tester/ +noperm diff --git a/Makefile b/Makefile index b3a8b9b..961da50 100644 --- a/Makefile +++ b/Makefile @@ -6,14 +6,14 @@ # By: iverniho +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/05/14 15:15:48 by iverniho #+# #+# # -# Updated: 2024/08/12 20:32:21 by iverniho ### ########.fr # +# Updated: 2024/08/22 13:01:07 by iverniho ### ########.fr # # # # **************************************************************************** # NAME = minishell CC = cc -CFLAGS = -Wall -Wextra -Werror #-fsanitize=address -g +CFLAGS = -Wall -Wextra -Werror #-fsanitize=address -static-libasan -g LIBFT = ./lib/libft/ @@ -33,19 +33,17 @@ SRC_INIT_DIR = ./src/init/ SRC_PARS_DIR = ./src/parser/ SRC_REDIRECT_DIR = ./src/redirect/ SRC_SIGNAL_DIR = ./src/signal/ -SRC_TESTER_DIR = ./src/tester/ SRC_UTILS_DIR = ./src/utils/ -SRC_BUILTIN = builtin_cd.c builtin_functions.c builtin_utils.c -SRC_ENV = envp_functions.c path_resolution.c additional_env.c env_utils.c -SRC_EXEC = execution.c +SRC_BUILTIN = builtin_cd.c builtin_exit.c builtin_utils.c builtin_echo.c builtin_pwd.c builtin_export.c builtin_unset.c +SRC_ENV = envp_functions.c additional_env.c env_utils.c +SRC_EXEC = execution.c command_utils.c path_utils.c pipe_utils.c exec_utils.c SRC_INIT = initilisation.c -SRC_PARS = parser.c parser_utils.c expand_vars.c tokenization.c tokenization_utils.c\ - tokenization_utils1.c expand_vars_utils.c expand_vars_utils1.c input.c node.c -SRC_REDIRECT = here_doc.c redirection.c set_redir_utils.c +SRC_PARS = parser.c parser_utils.c expand_vars.c tokenization_utils.c tokenization.c tokenization2.c\ + expand_vars_utils.c expand_vars_utils1.c expand_vars_utils2.c input.c node.c node_utils.c +SRC_REDIRECT = here_doc.c redirection.c SRC_SIGNAL = signal.c -SRC_TESTER = libft_extra_tests.c execution_tests.c node_tester.c -SRC_UTILS = error.c node_utils.c utils.c prompt.c +SRC_UTILS = error.c utils.c prompt.c SRC = $(SRC_DIR) \ $(SRC_GNL) \ diff --git a/am.sh b/am.sh new file mode 100755 index 0000000..d40294b --- /dev/null +++ b/am.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +make re +valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --track-fds=yes --suppressions=readline.supp ./minishell diff --git a/includes/minishell.h b/includes/minishell.h index f71d493..d34eac1 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -6,7 +6,6 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/14 15:11:41 by iverniho #+# #+# */ -/* Updated: 2024/08/15 12:26:46 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +27,6 @@ # include # include - # define PROMPT "minishell> " # define NEWLINE_ERR "minishell> syntax error near unexpected token `newline'" # define SYNTAX_ERR "minishell> syntax error near unexpected token " @@ -40,10 +38,6 @@ # define READ_END 0 # define WRITE_END 1 - -extern volatile sig_atomic_t g_sigint_received; -extern volatile sig_atomic_t g_is_executing_command; - # define MINISHELL_ASCII \ "\ ______ ____ ____ ____ ___ __ __ ___ _ _\n\ @@ -69,46 +63,47 @@ extern volatile sig_atomic_t g_is_executing_command; typedef struct param { - int token_count; - int i; -} t_param; + int token_count; + int i; +} t_param; typedef struct s_error_info { - int error_code; - const char *message; - void (*action)(int exit_code, char *arg, - const char *message); -} t_error_info; + int error_code; + const char *message; + void (*action)(int exit_code, char *arg, \ + const char *message); +} t_error_info; typedef struct s_signals { - volatile sig_atomic_t sigint_received; - volatile sig_atomic_t is_executing_command; -} t_signals; + volatile sig_atomic_t sigint_received; + volatile sig_atomic_t is_executing_command; +} t_signals; typedef struct s_mini { - char **envp; - t_list *node; - char *current_dir; - int exit_status; - t_signals signals; -} t_mini; + char **envp; + t_list *node; + char *current_dir; + int exit_status; + t_signals signals; +} t_mini; -extern t_mini *g_mini; +extern t_mini *g_mini; typedef struct s_cmd { - char **full_command; - char *command_path; - int fd_in; - int fd_out; - int is_heredoc; - int is_append; - int is_outfile; - t_mini *mini; -} t_cmd; + int pipe_fd; + char **full_command; + char *command_path; + int fd_in; + int fd_out; + int is_heredoc; + int is_append; + int is_outfile; + t_mini *mini; +} t_cmd; /* ************************************************************************** */ /* */ @@ -117,113 +112,140 @@ typedef struct s_cmd /* ************************************************************************** */ /* Initialization and Setup */ -t_cmd *init_cmd(void); -void init_mini(t_mini *mini); -void free_mini(t_mini **mini); -void init_envp(char **envp); -void free_cmd(void *cmd_ptr); -void handle_input(char *input); -t_list *create_nodes(char **input); -void setup_signal_handlers(void); -void setup_child_signals(void); -void handle_sigint(int sig); -void initialize_envp(char **envp); +t_cmd *init_cmd(void); +t_cmd *initialize_command(void); +void init_mini(t_mini *mini); +void free_mini(t_mini **mini); +void init_envp(char **envp); +void free_cmd(void *cmd_ptr); +void handle_input(char *input); +// t_list *create_nodes(char **input); +t_list *create_commands(char **tokenized_input); +void setup_signal_handlers(void); +void setup_child_signals(void); +void handle_sigint(int sig); +void initialize_envp(char **envp); +int process_redirections(t_cmd *cmd, + char ***tokenized_input); +char **process_expanded_array(char **expandedArray, + char **tmpTokArr); +int count_tokens(const char *str); +void setup_pipe_redirection(int i, int num_cmds, + int pipes[][2]); +void handle_fd_redirection(t_cmd *cmd); +void execute_command(t_cmd *cmd); +void create_pipes(int num_cmds, int pipes[][2]); +void close_pipes_in_child(int num_cmds, int pipes[][2], + int i); +void close_pipes_in_parent(int num_cmds, int pipes[][2]); /* Error Handling */ -void *mini_perror(char *str, char *str2, int fd); -void ft_error(int error_code, char *arg); -void ft_error_with_exit(int error_code, char *arg, - int exit_code, char *message); +void *mini_perror(char *str, char *str2, int fd); +void ft_error(int error_code, char *arg); +void ft_error_with_exit(char *arg, int exit_code, + char *message); +void setup_signal_handlers_exec(void); + /* Input Handling and Parsing */ -char **tokenize_input(char *input); -char **tokenize_special_symbols(const char *str, - int i, int token_count); -char **split_spaces(char *input, int w_count); -char **populate_token_array(char **tokenizedInput, - char *input); -int w_count_quotes(char *input); -int quotes_closed(char *line); -int ft_alloc_len(char const *s1); -char *ft_trimm_quotes(char const *s1, int s_quote, - int d_quote); -void allocate_and_copy_token1(char **tokens, - int token_count, const char *str, int c[5]); -void allocate_and_copy_token2(char **tokens, - int token_count, const char *str, int n[5]); -void imp_while(int *i, int len, const char *str, - int *start); -char **ft_add_row_2d_array1(char **array, char *row); -void add_special_row(char ***tempTokenArray, - char *specialSymbolArray, int *i); -char **split_spaces(char *input, int w_count); -void define_symbol_len(int *len, char index1, - char index2); -int is_special_char_input(char c); -int is_string_quoted(char *str); +char **tokenize_input(char *input); +char **tokenize_special_symbols(const char *str, int i, + int token_count); +// char **split_spaces(const char *str, +// int token_count); +char **populate_token_array(char **tokenizedInput, + char *input); +int w_count_quotes(char *input); +int quotes_closed(char *line); +int ft_alloc_len(char const *s1); +char *ft_trimm_quotes(char const *s1, int s_quote, + int d_quote); +void allocate_and_copy_token1(char **tokens, + int token_count, const char *str, int c[5]); +void allocate_and_copy_token2(char **tokens, + int token_count, const char *str, int n[5]); +void imp_while(int *i, int len, const char *str, + int *start); +char **ft_add_row_2d_array1(char **array, char *row); +void add_special_row(char ***tempTokenArray, + char *specialSymbolArray, int *i); +void define_symbol_len(int *len, char index1, + char index2); +int is_special_char_input(char c); +int is_string_quoted(const char *str); /* Variable Expansion and Environment Handling */ -char *find_var(char *var); -char **find_env_var_and_replace(char *var, - char **tokenizedInput); -char **expand_vars(char **tokenizedInput); -char **ft_remove_quotes(char **tokenizedInput); -char *remove_quotes(char *str, char q); -char **manage_replaced(char **replaced, - char **last_str); -int calculate_new_length(const char *input, int replacement_len); -void replace_and_build(const char *input, char *output, \ - const char *replacement_value); -char *replace_special_signs(const char *input); -int is_str_has_sigle_quottes(char *str); -int has_single_quoting(const char *str); +char *find_var(char *var); +char **find_env_var_and_replace(char *var, + char **tokenizedInput); +char **expand_vars(char **tokenizedInput); +char **ft_remove_quotes(char **tokenizedInput); +char *remove_quotes(char *str, char q); +char **manage_replaced(char **replaced, char **last_str); +int calculate_new_length(const char *input, + int replacement_len); +void replace_and_build(const char *input, char *output, + const char *replacement_value); +char *replace_special_signs(const char *input); +int is_str_has_sigle_quottes(char *str); +int has_single_quoting(const char *str); +char *handle_sprintf(int *src_idx); +void getenv_handler(char **env_value, int len, int *k); +char *imp_while1(char *str, int *src_idx, int *var_idx); +int if_env(char *env_value, char *str, \ + char **result, int *index); +void manage_replacing(int *index, \ + char *str, char **env_value); +char **remove_empty_elements(char **arr); +void split_handler(char ***temp, char *key_to_compare); /* Command Handling */ -void *check_to_fork(t_list *command); -t_cmd *set_redir(t_cmd *node, char *input, - char **full_command, int *i); -char *resolve_command_path(char *command); -int is_builtin(t_cmd *cmd); -void execute_builtin(t_cmd *cmd); -int check_after_equal(char *str); -int add_env_key(char *str, int len); -int is_special_char_in_env(char *str); -void replace_value(char *key, char *value); -int is_already_exist(char *key); -void show_last_command_status(char **str); -int is_special_char_export(char c); -int is_all_num(char *str); -int is_string_quoted(char *str); +void exec_pipes(t_list *commands); +t_cmd *set_redir(t_cmd *node, char *input, + char **full_command, int *i); +char *resolve_command_path(char *command); +int is_builtin(t_cmd *cmd); +void execute_builtin(t_cmd *cmd); +int check_after_equal(char *str); +int add_env_key(char *str, int len); +int is_special_char_in_env(char *str); +void replace_value(char *key, char *value); +int is_already_exist(char *key); +void show_last_command_status(char **str); +int is_special_char_export(char c); +int is_all_num(char *str); +// int is_string_quoted(char *str); /* Built-in Commands */ -int mini_cd(char **args); -void mini_echo(t_cmd *cmd); -void mini_pwd(void); -void mini_exit(char **args); -void mini_export(char **args); -void mini_env(void); -void mini_unset(char **args); +int mini_cd(char **args); +void mini_echo(t_cmd *cmd); +void mini_pwd(void); +void mini_exit(char **args); +void mini_export(char **args); +void mini_env(void); +void mini_unset(char **args); /* Execution and Testing */ -void prompt_loop(void); -int get_here_doc(const char *limit, - const char *warn); -void libft_extra_tester(void); -void print_nodes(t_list *node); -void test_exec(void); -void test_heredoc(void); -void debug_print_command_parts(t_cmd *cmd); -void debug_tokenized_input(char **tokenized_input); - -char *ft_getenv(const char *name, char **envp, - int len); -int get_fd(int oldfd, t_cmd *cmd, char *path, - int mode); -char **ft_setenv(const char *name, const char *value, - char **envp, int overwrite); -char **copy_env(char **envp); +void prompt_loop(void); +int get_here_doc(const char *limit); +void libft_extra_tester(void); +void print_nodes(t_list *node); +void test_exec(void); +void test_heredoc(void); +void debug_print_command_parts(t_cmd *cmd); +void debug_tokenized_input(char **tokenized_input); +int is_redirection(const char *token); + +char *ft_getenv(const char *name, char **envp, int len); +int get_fd(int oldfd, t_cmd *cmd, char *path, int mode); +char **ft_setenv(const char *name, const char *value, + char **envp, int overwrite); +char **copy_env(char **envp); /// temporary -int check_special_in_key(char *str); +int check_special_in_key(char *str); +int handle_edge_cases(char **args); +void copy_envp(t_mini *mini, char ***new_envp_array, + char *new_env); #endif // MINISHELL_H diff --git a/lib/libft/Makefile b/lib/libft/Makefile index cf47a6d..f16d131 100755 --- a/lib/libft/Makefile +++ b/lib/libft/Makefile @@ -3,10 +3,10 @@ # ::: :::::::: # # Makefile :+: :+: :+: # # +:+ +:+ +:+ # -# By: Jskehan +#+ +:+ +#+ # +# By: iverniho +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/05/28 17:01:09 by Jskehan #+# #+# # -# Updated: 2024/08/09 17:01:38 by Jskehan ### ########.fr # +# Updated: 2024/08/22 13:01:10 by iverniho ### ########.fr # # # # **************************************************************************** # @@ -16,7 +16,7 @@ RED=\033[0;31m NC=\033[0m # No Color (reset) NAME = libft.a -CC = gcc +CC = cc AR = ar rcs CFLAGS = -Wall -Wextra -Werror @@ -33,7 +33,8 @@ SRCS_BONUS = ft_lstnew.c ft_lstadd_front.c ft_lstsize.c ft_lstlast.c ft_lstadd_b SRC_EXTRA_DIR = src_extra/ SRCS_EXTRA = ft_1st_char_in_set_i.c ft_2d_array_len.c ft_add_row_2d_array.c ft_count_char.c ft_duplicate_2d_array.c \ ft_free_2d_array.c ft_is_space.c ft_print_2d_array_fd.c ft_splice_2d_array.c ft_strchr_i.c ft_realloc_2d_array.c \ - ft_add_row_2d_array_i.c ft_strjoin_free.c ft_is_only_special.c ft_is_special_symbol.c ft_strcmp.c ft_quote_string.c + ft_add_row_2d_array_i.c ft_strjoin_free.c ft_is_only_special.c ft_is_special_symbol.c ft_strcmp.c ft_quote_string.c \ + ft_isstr_digit.c ft_remove_paired_quotes.c ft_is_quote.c ft_contains_special_symbols.c ft_is_string_quoted.c # Include Directory INC = -I./includes diff --git a/lib/libft/includes/libft.h b/lib/libft/includes/libft.h index 8fa008c..a1d58ca 100644 --- a/lib/libft/includes/libft.h +++ b/lib/libft/includes/libft.h @@ -6,7 +6,7 @@ /* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/19 17:37:54 by iverniho #+# #+# */ -/* Updated: 2024/08/09 17:01:05 by Jskehan ### ########.fr */ +/* Updated: 2024/08/21 17:53:18 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ @@ -93,5 +93,10 @@ int ft_strchr_i(const char *s, int c); int ft_is_only_special(char *str); int ft_is_special_symbol(char c); int ft_strcmp(const char *s1, const char *s2); +int ft_isstr_digit(char *str); +char *ft_remove_paired_quotes(char *str); +int ft_is_quote(char c); +int ft_is_string_quoted(const char *str); +int ft_contains_special_symbols(const char *str); #endif diff --git a/lib/libft/src_extra/ft_add_row_2d_array.c b/lib/libft/src_extra/ft_add_row_2d_array.c index 70331dc..f297811 100644 --- a/lib/libft/src_extra/ft_add_row_2d_array.c +++ b/lib/libft/src_extra/ft_add_row_2d_array.c @@ -6,26 +6,12 @@ /* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/28 17:06:28 by Jskehan #+# #+# */ -/* Updated: 2024/08/09 16:05:56 by Jskehan ### ########.fr */ +/* Updated: 2024/08/19 15:22:13 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" -/** - * Function: ft_add_row_2d_array - * ----------------------------- - * Adds a row to a 2D array. - * - * @param array: A pointer to a 2D array. - * @param row: The row to add. - * - * @return: The new 2D array with the added row. - * - * Note: The array must be NULL-terminated. - */ -#include "libft.h" - /** * Function: ft_add_row_2d_array * ----------------------------- @@ -39,40 +25,68 @@ * * Note: The array must be NULL-terminated. */ +static char **allocate_new_array(int size) +{ + char **new_array; + + new_array = ft_calloc(size + 1, sizeof(char *)); + if (!new_array) + return (NULL); + return (new_array); +} + +static int copy_existing_rows(char **new_array, char **array, int count) +{ + int i; + + i = 0; + while (i < count) + { + new_array[i] = ft_strdup(array[i]); + if (!new_array[i]) + { + ft_free_2d_array(&new_array); + return (0); + } + i++; + } + return (1); +} + +static int add_new_row(char **new_array, char *row, int index, int free_row) +{ + new_array[index] = ft_strdup(row); + if (!new_array[index]) + { + ft_free_2d_array(&new_array); + return (0); + } + if (free_row) + free(row); + return (1); +} + char **ft_add_row_2d_array(char **array, char *row, int free_row) { int i; char **new_array; + i = 0; if (!row) return (array); if (!array) { - new_array = ft_calloc(2, sizeof(char *)); - if (!new_array) + new_array = allocate_new_array(1); + if (!new_array || !add_new_row(new_array, row, 0, free_row)) return (NULL); - new_array[0] = ft_strdup(row); - new_array[1] = NULL; - if (free_row) - free(row); return (new_array); } - i = 0; while (array[i]) i++; - new_array = ft_calloc(i + 2, sizeof(char *)); - if (!new_array) + new_array = allocate_new_array(i + 1); + if (!new_array || !copy_existing_rows(new_array, array, i) + || !add_new_row(new_array, row, i, free_row)) return (NULL); - i = 0; - while (array[i]) - { - new_array[i] = ft_strdup(array[i]); - i++; - } - new_array[i] = ft_strdup(row); - if (free_row) - free(row); - new_array[i + 1] = NULL; ft_free_2d_array(&array); return (new_array); } diff --git a/lib/libft/src_extra/ft_calloc.c b/lib/libft/src_extra/ft_calloc.c index 3c52961..9f85001 100644 --- a/lib/libft/src_extra/ft_calloc.c +++ b/lib/libft/src_extra/ft_calloc.c @@ -6,7 +6,7 @@ /* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/28 23:20:39 by Jskehan #+# #+# */ -/* Updated: 2024/06/06 16:38:52 by Jskehan ### ########.fr */ +/* Updated: 2024/08/21 17:49:59 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,8 @@ void *ft_calloc(size_t nmemb, size_t size) { char *str; + if (nmemb != 0 && size > SIZE_MAX / nmemb) + return (NULL); if (nmemb == 0 || size == 0) { nmemb = 1; diff --git a/lib/libft/src_extra/ft_contains_special_symbols.c b/lib/libft/src_extra/ft_contains_special_symbols.c new file mode 100644 index 0000000..9aa61fe --- /dev/null +++ b/lib/libft/src_extra/ft_contains_special_symbols.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_contains_special_symbols.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/21 17:13:36 by Jskehan #+# #+# */ +/* Updated: 2024/08/21 17:14:19 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_contains_special_symbols(const char *str) +{ + if (!str) + return (0); + while (*str) + { + if (*str == '<' || *str == '>' || *str == '|') + return (1); + str++; + } + return (0); +} diff --git a/lib/libft/src_extra/ft_is_only_special.c b/lib/libft/src_extra/ft_is_only_special.c index 4590c6a..f7ca47c 100644 --- a/lib/libft/src_extra/ft_is_only_special.c +++ b/lib/libft/src_extra/ft_is_only_special.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ft_is_only_special.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: iverniho +#+ +:+ +#+ */ +/* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/07 17:33:28 by iverniho #+# #+# */ -/* Updated: 2024/08/07 19:45:41 by iverniho ### ########.fr */ +/* Updated: 2024/08/21 17:55:43 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,8 @@ int ft_is_only_special(char *str) { - int i; + int i; + i = -1; while (str[++i]) { @@ -26,7 +27,8 @@ int ft_is_only_special(char *str) int ft_is_special_in_str(char *str) { - int i; + int i; + i = -1; while (str[++i]) { diff --git a/lib/libft/src_extra/ft_is_quote.c b/lib/libft/src_extra/ft_is_quote.c new file mode 100644 index 0000000..a3e14d2 --- /dev/null +++ b/lib/libft/src_extra/ft_is_quote.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_is_quote.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/21 16:59:08 by Jskehan #+# #+# */ +/* Updated: 2024/08/21 17:06:36 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_is_quote(char c) +{ + return (c == '\'' || c == '\"'); +} diff --git a/lib/libft/src_extra/ft_is_string_quoted.c b/lib/libft/src_extra/ft_is_string_quoted.c new file mode 100644 index 0000000..fb81b4c --- /dev/null +++ b/lib/libft/src_extra/ft_is_string_quoted.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_is_string_quoted.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/21 17:10:27 by Jskehan #+# #+# */ +/* Updated: 2024/08/21 17:47:00 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_is_string_quoted(const char *str) +{ + size_t len; + + if (!str) + return (0); + len = ft_strlen(str); + if ((str[0] == '\'' && str[len - 1] == '\'') || (str[0] == '\"' && str[len \ + - 1] == '\"')) + return (1); + return (0); +} diff --git a/lib/libft/src_extra/ft_isstr_digit.c b/lib/libft/src_extra/ft_isstr_digit.c new file mode 100644 index 0000000..c6274cd --- /dev/null +++ b/lib/libft/src_extra/ft_isstr_digit.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isstr_digit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/14 10:32:50 by Jskehan #+# #+# */ +/* Updated: 2024/08/14 10:34:15 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isstr_digit(char *str) +{ + int i; + + if (!str) + return (0); + i = 0; + if (str[i] == '-' || str[i] == '+') + i++; + while (str[i]) + { + if (!ft_isdigit(str[i])) + return (0); + i++; + } + return (1); +} diff --git a/lib/libft/src_extra/ft_print_2d_array_fd.c b/lib/libft/src_extra/ft_print_2d_array_fd.c index 2477a57..0486470 100644 --- a/lib/libft/src_extra/ft_print_2d_array_fd.c +++ b/lib/libft/src_extra/ft_print_2d_array_fd.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ft_print_2d_array_fd.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: iverniho +#+ +:+ +#+ */ +/* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/28 17:21:48 by Jskehan #+# #+# */ -/* Updated: 2024/08/09 16:25:03 by iverniho ### ########.fr */ +/* Updated: 2024/08/21 17:48:02 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,8 @@ int ft_print_2d_array_fd(char **array, int fd) i = 0; while (array && array[i]) { - ft_putendl_fd(array[i], fd); + printf("%d:", i); + printf("%s\n", array[i]); i++; } return (i); diff --git a/lib/libft/src_extra/ft_remove_paired_quotes.c b/lib/libft/src_extra/ft_remove_paired_quotes.c new file mode 100644 index 0000000..16aa00f --- /dev/null +++ b/lib/libft/src_extra/ft_remove_paired_quotes.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_remove_paired_quotes.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/12 16:56:48 by Jskehan #+# #+# */ +/* Updated: 2024/08/12 16:57:17 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_remove_paired_quotes(char *str) +{ + int src_idx; + int dest_idx; + int single_quote_open; + int double_quote_open; + + src_idx = 0; + dest_idx = 0; + single_quote_open = 0; + double_quote_open = 0; + if (!str) + return (NULL); + while (str[src_idx]) + { + if (str[src_idx] == '\'' && !double_quote_open) + single_quote_open = !single_quote_open; + else if (str[src_idx] == '\"' && !single_quote_open) + double_quote_open = !double_quote_open; + else + str[dest_idx++] = str[src_idx]; + src_idx++; + } + str[dest_idx] = '\0'; + return (str); +} diff --git a/lib/libft/src_extra/ft_splice_2d_array.c b/lib/libft/src_extra/ft_splice_2d_array.c index b933b6d..81a5850 100644 --- a/lib/libft/src_extra/ft_splice_2d_array.c +++ b/lib/libft/src_extra/ft_splice_2d_array.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ft_splice_2d_array.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: iverniho +#+ +:+ +#+ */ +/* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/30 23:55:10 by Jskehan #+# #+# */ -/* Updated: 2024/08/09 16:29:28 by iverniho ### ########.fr */ +/* Updated: 2024/08/21 17:47:44 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,40 +22,40 @@ * Note: The function frees the original 2d_arrray. if succesful * Note: NULL if i > dest_len or i < 0 */ -char **ft_splice_2d_array(char **dest, char **src, int n) -{ - char **temp; - int dest_i; - int src_i; - int total_i; - int total_len; +// char **ft_splice_2d_array(char **dest, char **src, int n) +// { +// char **temp; +// int dest_i; +// int src_i; +// int total_i; +// int total_len; - if (!dest || !dest[0]) - { - total_len = ft_2d_array_len(src); - temp = ft_calloc(total_len + 1, sizeof(char *)); - if (!temp) - return (NULL); - src_i = -1; - while (++src_i < total_len) - temp[src_i] = ft_strdup(src[src_i]); - return (temp); - } - total_len = ft_2d_array_len(dest) + ft_2d_array_len(src); - dest_i = -1; - src_i = -1; - total_i = -1; - if (n < 0 || n >= ft_2d_array_len(dest)) - return (NULL); - temp = ft_calloc(total_len + 1, sizeof(char *)); - while (temp && dest[++dest_i]) - { - if (dest_i != n) - temp[++total_i] = ft_strdup(dest[dest_i]); - else - while (src && src[++src_i]) - temp[++total_i] = ft_strdup(src[src_i]); - } - ft_free_2d_array(&dest); - return (temp); -} +// if (!dest || !dest[0]) +// { +// total_len = ft_2d_array_len(src); +// temp = ft_calloc(total_len + 1, sizeof(char *)); +// if (!temp) +// return (NULL); +// src_i = -1; +// while (++src_i < total_len) +// temp[src_i] = ft_strdup(src[src_i]); +// return (temp); +// } +// total_len = ft_2d_array_len(dest) + ft_2d_array_len(src); +// dest_i = -1; +// src_i = -1; +// total_i = -1; +// if (n < 0 || n >= ft_2d_array_len(dest)) +// return (NULL); +// temp = ft_calloc(total_len + 1, sizeof(char *)); +// while (temp && dest[++dest_i]) +// { +// if (dest_i != n) +// temp[++total_i] = ft_strdup(dest[dest_i]); +// else +// while (src && src[++src_i]) +// temp[++total_i] = ft_strdup(src[src_i]); +// } +// ft_free_2d_array(&dest); +// return (temp); +// } diff --git a/makeTest.sh b/makeTest.sh new file mode 100755 index 0000000..ab4bce7 --- /dev/null +++ b/makeTest.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Run make +make re + +# Change directory to minishell_tester +cd minishell_tester + +# Run ./tester +./tester diff --git a/readline.supp b/readline.supp new file mode 100644 index 0000000..746461e --- /dev/null +++ b/readline.supp @@ -0,0 +1,12 @@ +{ + leak readline + Memcheck:Leak + ... + fun:readline +} +{ + leak add_history + Memcheck:Leak + ... + fun:add_history +} diff --git a/src/builtin/builtin_cd.c b/src/builtin/builtin_cd.c index d872949..e6759b7 100644 --- a/src/builtin/builtin_cd.c +++ b/src/builtin/builtin_cd.c @@ -6,25 +6,12 @@ /* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/18 18:06:33 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 17:47:20 by Jskehan ### ########.fr */ +/* Updated: 2024/08/21 17:46:03 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -static void print_error(char **args) -{ - ft_putstr_fd("cd: ", 2); - if (args[2]) - ft_putstr_fd("string not in pwd: ", 2); - else - { - ft_putstr_fd(strerror(errno), 2); - ft_putstr_fd(": ", 2); - } - ft_putendl_fd(args[1], 2); -} - static char *get_env_path(char **envp, const char *var, size_t len) { char *path; @@ -37,14 +24,13 @@ static char *get_env_path(char **envp, const char *var, size_t len) if (ft_strncmp(*envp, var, len) == 0) { s_alloc = ft_strlen(*envp) - len; - if (!(path = malloc(sizeof(char) * (s_alloc + 1)))) + path = malloc(sizeof(char) * (s_alloc + 1)); + if (!(path)) return (NULL); i = len; j = 0; while ((*envp)[i]) - { path[j++] = (*envp)[i++]; - } path[j] = '\0'; return (path); } @@ -53,16 +39,17 @@ static char *get_env_path(char **envp, const char *var, size_t len) return (NULL); } -static int update_oldpwd(t_mini *mini) +static int update_oldpwd(void) { char cwd[PATH_MAX]; char *oldpwd; if (getcwd(cwd, PATH_MAX) == NULL) return (1); - if (!(oldpwd = ft_strjoin("OLDPWD=", cwd))) + oldpwd = ft_strjoin("OLDPWD=", cwd); + if (!(oldpwd)) return (1); - mini->envp = ft_setenv("OLDPWD", cwd, mini->envp, 1); + g_mini->envp = ft_setenv("OLDPWD", cwd, g_mini->envp, 1); free(oldpwd); return (0); } @@ -75,24 +62,19 @@ static int go_to_path(int option, t_mini *mini) env_path = NULL; if (option == 0) { - if (update_oldpwd(mini) != 0) + if (update_oldpwd() != 0) return (1); env_path = get_env_path(mini->envp, "HOME=", 5); + printf("%s\n", env_path); if (!env_path) - { - // ft_putendl_fd("minishell: cd: HOME not set", 2); return (1); - } } else if (option == 1) { env_path = get_env_path(mini->envp, "OLDPWD=", 7); if (!env_path) - { - // ft_putendl_fd("minishell: cd: OLDPWD not set", 2); return (1); - } - if (update_oldpwd(mini) != 0) + if (update_oldpwd() != 0) return (1); } ret = chdir(env_path); @@ -100,11 +82,27 @@ static int go_to_path(int option, t_mini *mini) return (ret); } +static int set_newpwd(t_mini *mini) +{ + char *newpwd; + + newpwd = getcwd(NULL, 0); + if (!newpwd) + { + perror("getcwd"); + return (1); + } + mini->envp = ft_setenv("PWD", newpwd, mini->envp, 1); + if (mini->current_dir) + free(mini->current_dir); + mini->current_dir = newpwd; + return (0); +} + // The `cd` built-in command implementation int mini_cd(char **args) { - int cd_ret; - char *newpwd; + int cd_ret; if (!args[1]) return (go_to_path(0, g_mini)); @@ -112,24 +110,19 @@ int mini_cd(char **args) cd_ret = go_to_path(1, g_mini); else { - if (update_oldpwd(g_mini) != 0) + if (update_oldpwd() != 0) return (1); cd_ret = chdir(args[1]); if (cd_ret < 0) { - print_error(args); + perror("minishell: cd"); return (1); } } - newpwd = getcwd(NULL, 0); - if (!newpwd) + if (cd_ret == 0) { - perror("getcwd"); - return (1); + if (set_newpwd(g_mini) != 0) + return (1); } - g_mini->envp = ft_setenv("PWD", newpwd, g_mini->envp, 1); - g_mini->current_dir = newpwd; - // printf("Current directory: %s\n", mini->current_dir); - free(newpwd); return (0); } diff --git a/src/builtin/builtin_echo.c b/src/builtin/builtin_echo.c new file mode 100644 index 0000000..e2d3067 --- /dev/null +++ b/src/builtin/builtin_echo.c @@ -0,0 +1,63 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* builtin_echo.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: iverniho +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/16 10:40:36 by Jskehan #+# #+# */ +/* Updated: 2024/08/22 12:54:51 by iverniho ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int check_newline_option(char **full_command, int *i) +{ + if (full_command[*i] && ft_strcmp(full_command[*i], "-n") == 0) + { + (*i)++; + return (0); + } + return (1); +} + +static int handle_special_case(char *arg, char **full_command) +{ + if (ft_strcmp(arg, "$?") == 0) + { + show_last_command_status(full_command); + return (1); + } + return (0); +} + +static void print_command_arguments(char **full_command, int start_index, + int fd_out) +{ + int i; + + i = start_index; + while (full_command[i]) + { + if (handle_special_case(full_command[i], full_command)) + return ; + ft_putstr_fd(full_command[i], fd_out); + if (full_command[i + 1]) + ft_putstr_fd(" ", fd_out); + i++; + } +} + +void mini_echo(t_cmd *cmd) +{ + int i; + int newline; + + i = 1; + newline = check_newline_option(cmd->full_command, &i); + print_command_arguments(cmd->full_command, i, cmd->pipe_fd); + if (newline) + ft_putstr_fd("\n", cmd->pipe_fd); + g_mini->exit_status = 0; +} diff --git a/src/builtin/builtin_exit.c b/src/builtin/builtin_exit.c new file mode 100644 index 0000000..430d952 --- /dev/null +++ b/src/builtin/builtin_exit.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* builtin_exit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/16 10:40:36 by Jskehan #+# #+# */ +/* Updated: 2024/08/26 18:30:39 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +// Handle the `exit` built-in command +void mini_exit(char **args) +{ + int exit_status; + + exit_status = g_mini->exit_status; + if (ft_2d_array_len(args) > 2) + { + ft_error_with_exit(NULL, 1, "too many arguments"); + exit(1); + } + else if (args[1] && !ft_isstr_digit(args[1])) + { + ft_error_with_exit(args[1], 2, "numeric argument required"); + exit(2); + } + else if (args[1]) + exit_status = ft_atoi(args[1]); + else + exit_status = g_mini->exit_status; + free_mini(&g_mini); + exit(exit_status); +} diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c new file mode 100644 index 0000000..820fa96 --- /dev/null +++ b/src/builtin/builtin_export.c @@ -0,0 +1,88 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* builtin_export.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: iverniho +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/13 14:32:11 by Jskehan #+# #+# */ +/* Updated: 2024/08/23 14:21:27 by iverniho ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int handle_new_key(char **args) +{ + if ((!ft_strchr(*(args + 1), '=')) || (!check_after_equal(*(args + 1)))) + { + if (add_env_key(*(args + 1), ft_2d_array_len(g_mini->envp) + 1)) + return (1); + } + return (0); +} + +static int prepare_key_value(char **args, char **key, char **value) +{ + char **temp; + + temp = ft_split(*(args + 1), '='); + *key = ft_strdup(temp[0]); + *value = ft_strdup(temp[1]); + ft_free_2d_array(&temp); + if (!(*key) || !(*value)) + return (1); + return (0); +} + +static void replace_existing_value(char *key, char *value) +{ + replace_value(key, value); + free(key); + free(value); +} + +static void add_new_env_var(char *key, char *value) +{ + char *new_env; + char **new_envp_array; + char *temp; + + temp = ft_strjoin("=", value); + new_env = ft_strjoin(key, temp); + free(temp); + new_envp_array = ft_calloc((ft_2d_array_len(g_mini->envp) + 1) + 2, + sizeof(char *)); + if (!new_envp_array) + { + free(key); + free(value); + free(new_env); + return ; + } + copy_envp(g_mini, &new_envp_array, new_env); + free(key); + free(value); + free(new_env); +} + +void mini_export(char **args) +{ + char *key; + char *value; + + if (handle_edge_cases(args)) + return ; + if (handle_new_key(args)) + return ; + if (prepare_key_value(args, &key, &value)) + { + free(key); + free(value); + return ; + } + if (!is_already_exist(key)) + add_new_env_var(key, value); + else + replace_existing_value(key, value); +} diff --git a/src/builtin/builtin_functions.c b/src/builtin/builtin_functions.c index a234013..36ca426 100644 --- a/src/builtin/builtin_functions.c +++ b/src/builtin/builtin_functions.c @@ -3,74 +3,15 @@ /* ::: :::::::: */ /* builtin_functions.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ +/* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/16 10:40:36 by Jskehan #+# #+# */ -/* Updated: 2024/08/07 12:55:29 by Jskehan ### ########.fr */ +/* Updated: 2024/08/21 17:44:53 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -// Implementation of echo command with '-n' option -void mini_echo(t_cmd *cmd) -{ - int i = 1; - int newline = 1; - - if (cmd->full_command[i] && ft_strcmp(cmd->full_command[i], "-n") == 0) - { - newline = 0; - i++; - } - while (cmd->full_command[i]) - { - if (ft_strcmp(cmd->full_command[i], "$?") == 0) - { - show_last_command_status(cmd->full_command); - return; - } - else - { - ft_putstr_fd(cmd->full_command[i], cmd->fd_out); - if (cmd->full_command[i + 1]) - ft_putstr_fd(" ", cmd->fd_out); - i++; - } - } - if (newline) - ft_putstr_fd("\n", cmd->fd_out); -} - - -// Implementation of pwd command -void mini_pwd(void) -{ - char *pwd; - - pwd = getcwd(NULL, 0); - if (pwd) - { - ft_putstr_fd(pwd, 1); - ft_putstr_fd("\n", 1); - free(pwd); - } - else - { - perror("getcwd"); - } -} -// void mini_exit(char **args, t_mini *mini) -// { -// int exit_status; - -// if (args[1]) -// exit_status = ft_atoi(args[1]); -// else -// exit_status = mini->exit_status; -// // For example: free allocated memory, close file descriptors, etc. -// exit(exit_status); -// } int ft_isdigit_str(char *str) { int i; @@ -97,12 +38,12 @@ void mini_exit(char **args) exit_status = g_mini->exit_status; if (ft_2d_array_len(args) > 2) { - ft_error_with_exit(8, NULL, 1, "too many arguments"); + ft_error_with_exit(NULL, 1, "too many arguments"); exit(1); } else if (args[1] && !ft_isdigit_str(args[1])) { - ft_error_with_exit(7, args[1], 2, "numeric argument required"); + ft_error_with_exit(args[1], 2, "numeric argument required"); exit(2); } else if (args[1]) diff --git a/src/tester/node_tester.c b/src/builtin/builtin_pwd.c similarity index 56% rename from src/tester/node_tester.c rename to src/builtin/builtin_pwd.c index f987cdd..3c21816 100644 --- a/src/tester/node_tester.c +++ b/src/builtin/builtin_pwd.c @@ -1,40 +1,31 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* node_tester.c :+: :+: :+: */ +/* builtin_pwd.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/07/16 11:42:10 by Jskehan #+# #+# */ -/* Updated: 2024/07/16 11:45:22 by Jskehan ### ########.fr */ +/* Created: 2024/08/14 10:30:22 by Jskehan #+# #+# */ +/* Updated: 2024/08/14 10:30:43 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void debug_print_command_parts(t_cmd *cmd) +// Implementation of pwd command +void mini_pwd(void) { - int j; + char *pwd; - j = 0; - if (cmd && cmd->full_command) + pwd = getcwd(NULL, 0); + if (pwd) { - while (cmd->full_command[j]) - { - printf("Command Part[%d]: %s\n", j, cmd->full_command[j]); - j++; - } + ft_putstr_fd(pwd, 1); + ft_putstr_fd("\n", 1); + free(pwd); } -} - -void debug_tokenized_input(char **tokenized_input) -{ - int j; - - j = 0; - while (tokenized_input[j]) + else { - printf("Tokenized Input[%d]: %s\n", j, tokenized_input[j]); - j++; + perror("getcwd"); } } diff --git a/src/builtin/builtin_unset.c b/src/builtin/builtin_unset.c new file mode 100644 index 0000000..a139fc6 --- /dev/null +++ b/src/builtin/builtin_unset.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* builtin_unset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/21 17:43:48 by Jskehan #+# #+# */ +/* Updated: 2024/08/21 17:43:54 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void mini_unset(char **args) +{ + int i; + char **new_env_arr; + int j; + + if (ft_2d_array_len(args) < 2) + return ; + i = -1; + j = 0; + new_env_arr = ft_calloc(ft_2d_array_len(g_mini->envp), sizeof(char *)); + if (!new_env_arr) + return ; + while (g_mini->envp[++i]) + { + if (ft_strncmp(g_mini->envp[i], args[1], ft_strlen(args[1])) != 0) + new_env_arr[j++] = ft_strdup(g_mini->envp[i]); + } + new_env_arr[j] = NULL; + ft_free_2d_array(&g_mini->envp); + g_mini->envp = new_env_arr; +} diff --git a/src/builtin/builtin_utils.c b/src/builtin/builtin_utils.c index 9ac2f3e..f54fb54 100644 --- a/src/builtin/builtin_utils.c +++ b/src/builtin/builtin_utils.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* builtin_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: iverniho +#+ +:+ +#+ */ +/* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/16 10:43:33 by Jskehan #+# #+# */ -/* Updated: 2024/08/12 20:10:39 by iverniho ### ########.fr */ +/* Updated: 2024/08/14 12:38:08 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/env/additional_env.c b/src/env/additional_env.c index 0c5c7e1..2881649 100644 --- a/src/env/additional_env.c +++ b/src/env/additional_env.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* additional_env.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ +/* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/27 17:12:47 by iverniho #+# #+# */ -/* Updated: 2024/08/05 21:26:29 by Jskehan ### ########.fr */ +/* Updated: 2024/08/23 14:25:38 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,23 +32,21 @@ int is_already_exist(char *key) char *key_to_compare; i = -1; - key_to_compare = key; - if (ft_strchr(key_to_compare, '=')) + if (key) { - temp = ft_split(key_to_compare, '='); - key_to_compare = ft_strdup(temp[0]); - ft_free_2d_array(&temp); - } - while (g_mini->envp[++i]) - { - temp = ft_split(g_mini->envp[i], '='); - if (!temp[0]) - return (1); - temp_key = ft_strdup(temp[0]); - if (ft_strcmp(temp_key, key_to_compare) == 0) - return (free(temp_key), ft_free_2d_array(&temp), 1); - free(temp_key); - ft_free_2d_array(&temp); + key_to_compare = key; + if (ft_strchr(key_to_compare, '=')) + split_handler(&temp, key_to_compare); + while (g_mini->envp[++i]) + { + temp = ft_split(g_mini->envp[i], '='); + if (!temp[0]) + return (1); + temp_key = temp[0]; + if (ft_strcmp(temp_key, key_to_compare) == 0) + return (ft_free_2d_array(&temp), 1); + ft_free_2d_array(&temp); + } } return (0); } @@ -79,38 +77,22 @@ void export_with_no_args(void) } } -void mini_export(char **args) +int handle_edge_cases(char **args) { - char *key; - char *value; - char **temp; - char *new_env; - char **new_envp_array; - if (ft_2d_array_len(args) < 2) - return (export_with_no_args()); + { + export_with_no_args(); + return (1); + } if (is_special_char_in_env(*(args + 1))) { g_mini->exit_status = 1; - return ; + return (1); } if (ft_strlen(args[1]) == 1 && args[1][0] == '=') - return (ft_error_with_exit(9, args[1], 1, NOT_VALID_ID)); - if ((!ft_strchr(*(args + 1), '=')) || (!check_after_equal(*(args + 1)))) - if (add_env_key(*(args + 1), ft_2d_array_len(g_mini->envp) + 1)) - return ; - value = NULL; - temp = ft_split(*(args + 1), '='); - key = ft_strdup(temp[0]); - value = ft_strdup(temp[1]); - ft_free_2d_array(&temp); - if (is_already_exist(key)) - return (replace_value(key, value), free(key), free(value)); - new_env = ft_strjoin(key, ft_strjoin("=", value)); - new_envp_array = ft_calloc((ft_2d_array_len(g_mini->envp) + 1) \ - + 2, sizeof(char *)); - if (!new_envp_array) - return (free(key), free(value), free(new_env)); - copy_envp(g_mini, &new_envp_array, new_env); - return (free(key), free(value), free(new_env)); + { + ft_error_with_exit(args[1], 1, NOT_VALID_ID); + return (1); + } + return (0); } diff --git a/src/env/env_utils.c b/src/env/env_utils.c index 8edc7f2..790fa8b 100644 --- a/src/env/env_utils.c +++ b/src/env/env_utils.c @@ -3,38 +3,15 @@ /* ::: :::::::: */ /* env_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ +/* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/28 15:47:19 by iverniho #+# #+# */ -/* Updated: 2024/08/07 12:39:12 by Jskehan ### ########.fr */ +/* Updated: 2024/08/23 14:20:56 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void mini_unset(char **args) -{ - int i; - char **new_env_arr; - int j; - - if (ft_2d_array_len(args) < 2) - return ; - i = -1; - j = 0; - new_env_arr = ft_calloc(ft_2d_array_len(g_mini->envp), sizeof(char *)); - if (!new_env_arr) - return ; - while (g_mini->envp[++i]) - { - if (ft_strncmp(g_mini->envp[i], args[1], ft_strlen(args[1])) != 0) - new_env_arr[j++] = ft_strdup(g_mini->envp[i]); - } - new_env_arr[j] = NULL; - ft_free_2d_array(&g_mini->envp); - g_mini->envp = new_env_arr; -} - int check_special_in_key(char *str) { int i; @@ -66,7 +43,7 @@ int check_after_equal(char *str) return (1); } -//does actions if there is only key, without any value +// does actions if there is only key, without any value int add_env_key(char *str, int len) { char *value; @@ -103,8 +80,9 @@ int is_special_char_in_env(char *str) i = 0; while (str[i] != '\0') { - if (((ft_isalpha(str[i]) || (i > 0 && ft_isdigit(str[i])) \ - || str[i] == '_' || str[i] == '=')) && (!is_special_char_export(str[i])) ) + if (((ft_isalpha(str[i]) || (i > 0 && ft_isdigit(str[i])) + || str[i] == '_' || str[i] == '=')) + && (!is_special_char_export(str[i]))) i++; else if (str[i] == '=') return (0); @@ -126,25 +104,25 @@ void replace_value(char *key, char *value) char **temp; char *temp_key; char *new_env; + char *temp_value; - i = 0; - while (g_mini->envp[i]) + i = -1; + while (g_mini->envp[++i]) { temp = ft_split(g_mini->envp[i], '='); if (!temp[0]) return ; - temp_key = ft_strdup(temp[0]); + temp_key = temp[0]; if (ft_strcmp(temp_key, key) == 0) { - new_env = ft_strjoin(key, ft_strjoin("=", value)); + temp_value = ft_strjoin("=", value); + new_env = ft_strjoin(key, temp_value); + free(temp_value); free(g_mini->envp[i]); g_mini->envp[i] = ft_strdup(new_env); - free(temp_key); ft_free_2d_array(&temp); - return ; + return (free(new_env)); } - free(temp_key); ft_free_2d_array(&temp); - i++; } } diff --git a/src/env/envp_functions.c b/src/env/envp_functions.c index a2805fc..33f5acc 100644 --- a/src/env/envp_functions.c +++ b/src/env/envp_functions.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* envp_functions.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ +/* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/18 15:49:43 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 18:09:02 by Jskehan ### ########.fr */ +/* Updated: 2024/08/23 13:07:03 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,77 +29,98 @@ char *ft_getenv(const char *name, char **envp, int len) return (NULL); } -char **ft_setenv(const char *name, const char *value, char **envp, - int overwrite) +static char *update_existing_envp(char **envp, const char *name, + const char *value, int overwrite) { int i; char *new_envp; - char **new_envp_array; char *temp; - // printf("ft_setenv called with name=%s, value=%s, overwrite=%d\n", name, - // value, overwrite); i = 0; while (envp && envp[i]) { - // printf("Checking envp[%d]: %s\n", i, envp[i]); if (!strncmp(envp[i], name, strlen(name)) && envp[i][strlen(name)] == '=') { - // printf("Match found at envp[%d]\n", i); if (overwrite) { - // printf("Overwriting existing value\n"); temp = ft_strjoin(name, "="); new_envp = ft_strjoin_free(temp, (char *)value); free(envp[i]); envp[i] = new_envp; } - return (envp); + return (envp[i]); } i++; } - printf("No existing entry found, adding new\n"); - new_envp_array = ft_calloc(i + 2, sizeof(char *)); + return (NULL); +} + +static char **add_new_envp(char **envp, const char *name, const char *value, + int count) +{ + char **new_envp_array; + char *new_envp; + char *temp; + int j; + + j = 0; + new_envp_array = ft_calloc(count + 2, sizeof(char *)); if (!new_envp_array) { printf("Memory allocation for new_envp_array failed\n"); return (NULL); } - for (int j = 0; j < i; j++) + while (j < count) { new_envp_array[j] = envp[j]; + j++; } temp = ft_strjoin(name, "="); new_envp = ft_strjoin_free(temp, (char *)value); - new_envp_array[i] = new_envp; - new_envp_array[i + 1] = NULL; - free(envp); - printf("New environment variable added: %s=%s\n", name, value); + new_envp_array[count] = new_envp; + new_envp_array[count + 1] = NULL; return (new_envp_array); } +char **ft_setenv(const char *name, const char *value, char **envp, + int overwrite) +{ + int i; + char *updated_envp; + + i = 0; + updated_envp = update_existing_envp(envp, name, value, overwrite); + if (updated_envp) + return (envp); + while (envp && envp[i]) + i++; + return (add_new_envp(envp, name, value, i)); +} + char **copy_env(char **envp) { int i; char **new_envp; - for (i = 0; envp[i]; i++) - ; + i = 0; + while (envp[i]) + i++; new_envp = malloc((i + 1) * sizeof(char *)); if (!new_envp) return (NULL); - for (i = 0; envp[i]; i++) + i = 0; + while (envp[i]) { new_envp[i] = strdup(envp[i]); if (!new_envp[i]) { - // Free previously allocated memory in case of failure while (i--) free(new_envp[i]); free(new_envp); return (NULL); } + i++; } new_envp[i] = NULL; return (new_envp); diff --git a/src/exec/command_utils.c b/src/exec/command_utils.c new file mode 100644 index 0000000..1bcaeca --- /dev/null +++ b/src/exec/command_utils.c @@ -0,0 +1,76 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* command_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/16 15:33:04 by Jskehan #+# #+# */ +/* Updated: 2024/08/26 18:49:16 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int is_directory(const char *command_path) +{ + int fd; + char buf; + + fd = open(command_path, O_RDONLY); + if (fd != -1) + { + if (read(fd, &buf, 1) == -1 && errno == EISDIR) + { + close(fd); + return (1); + } + close(fd); + } + return (0); +} + +void execute_command(t_cmd *cmd) +{ + char *command_path; + + command_path = resolve_command_path(cmd->full_command[0]); + if (command_path) + { + if (is_directory(command_path)) + { + ft_putstr_fd("minishell", STDERR_FILENO); + perror(" "); + free(command_path); + g_mini->exit_status = 126; + return ; + } + execve(command_path, cmd->full_command, g_mini->envp); + ft_putstr_fd("minishell", STDERR_FILENO); + perror(" "); + free(command_path); + g_mini->exit_status = 126; + } +} + +void handle_fd_redirection(t_cmd *cmd) +{ + if (cmd->fd_in != STDIN_FILENO) + { + if (dup2(cmd->fd_in, STDIN_FILENO) == -1) + { + perror("dup2"); + exit(EXIT_FAILURE); + } + close(cmd->fd_in); + } + if (cmd->fd_out != STDOUT_FILENO) + { + if (dup2(cmd->fd_out, STDOUT_FILENO) == -1) + { + perror("dup2"); + exit(EXIT_FAILURE); + } + close(cmd->fd_out); + } +} diff --git a/src/parser/tokenization_utils1.c b/src/exec/exec_utils.c similarity index 51% rename from src/parser/tokenization_utils1.c rename to src/exec/exec_utils.c index 2ffa2e2..d240e62 100644 --- a/src/parser/tokenization_utils1.c +++ b/src/exec/exec_utils.c @@ -1,33 +1,24 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* tokenization_utils1.c :+: :+: :+: */ +/* exec_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/08/08 12:38:19 by iverniho #+# #+# */ -/* Updated: 2024/08/08 12:41:48 by iverniho ### ########.fr */ +/* Created: 2024/08/19 12:11:01 by Jskehan #+# #+# */ +/* Updated: 2024/08/23 13:07:10 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -// Split by Spaces Function -char **split_spaces(char *input, int w_count) +int is_redirection(const char *token) { - char **tokenized_input; - - tokenized_input = ft_calloc(w_count + 1, sizeof(char *)); - if (!tokenized_input) - return (NULL); - tokenized_input = populate_token_array(tokenized_input, input); - return (tokenized_input); -} - -// Define Symbol Length Function -void define_symbol_len(int *len, char index1, char index2) -{ - *len = 1; - if ((index1 == '<' && index2 == '<') || (index1 == '>' && index2 == '>')) - *len = 2; + if (!token) + return (0); + if (ft_strcmp(token, ">") == 0 || ft_strcmp(token, ">>") == 0 \ + || ft_strcmp(token, + "<") == 0 || ft_strcmp(token, "<<") == 0) + return (1); + return (0); } diff --git a/src/exec/execution.c b/src/exec/execution.c index 03b3afc..87a5fc3 100644 --- a/src/exec/execution.c +++ b/src/exec/execution.c @@ -6,138 +6,57 @@ /* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/16 10:52:13 by Jskehan #+# #+# */ -/* Updated: 2024/08/12 12:25:11 by Jskehan ### ########.fr */ +/* Updated: 2024/08/26 18:56:15 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -static void child_redir(t_cmd *cmd) +static void wait_for_children(int num_cmds) { - if (cmd->fd_in != STDIN_FILENO) - { - if (dup2(cmd->fd_in, STDIN_FILENO) == -1) - perror("dup2"); - close(cmd->fd_in); - } - if (cmd->fd_out != STDOUT_FILENO) - { - if (dup2(cmd->fd_out, STDOUT_FILENO) == -1) - perror("dup2"); - close(cmd->fd_out); - } - if (cmd->fd_out == -1) + int status; + + while (--num_cmds >= 0) { - if (close(STDOUT_FILENO) == -1) - perror("close"); + wait(&status); + if (WIFEXITED(status)) + g_mini->exit_status = WEXITSTATUS(status); + else if (WIFSIGNALED(status)) + g_mini->exit_status = 1; } } -static void execute_command(t_cmd *cmd) +static void handle_child(t_cmd *cmd, int pipes[][2], int i, int num_cmds) { - char *command_path; - + setup_child_signals(); + setup_pipe_redirection(i, num_cmds, pipes); + handle_fd_redirection(cmd); if (is_builtin(cmd)) - { execute_builtin(cmd); - exit(g_mini->exit_status); - } else - { - command_path = resolve_command_path(cmd->full_command[0]); - if (command_path) - { - execve(command_path, cmd->full_command, g_mini->envp); - ft_error_with_exit(126, cmd->full_command[0], 126, ": Permission denied\n"); - free(command_path); - exit(126); - } - else - ft_error_with_exit(127, cmd->full_command[0], 127, ": command not found\n"); - } + execute_command(cmd); + exit(g_mini->exit_status); } -static void child_process(t_cmd *cmd) +static void fork_and_execute(t_cmd *cmd, int pipes[][2], int i, int num_cmds) { - setup_child_signals(); - if (cmd->fd_in == -1 || cmd->fd_out == -1) - exit(EXIT_FAILURE); - child_redir(cmd); - execute_command(cmd); -} - -static void create_pipes(int num_cmds, int pipes[][2]) -{ - int i; - - i = -1; - while (++i < num_cmds - 1) - { - if (pipe(pipes[i]) == -1) - { - perror("pipe"); - exit(EXIT_FAILURE); - } - } -} - -static void close_pipes_in_parent(int num_cmds, int pipes[][2]) -{ - int i; - - i = -1; - while (++i < num_cmds - 1) - { - close(pipes[i][0]); - close(pipes[i][1]); - } -} - -static void close_pipes_in_child(int num_cmds, int pipes[][2], int i) -{ - int j; - - j = -1; - while (++j < num_cmds - 1) - { - if (j != i - 1) - close(pipes[j][0]); - if (j != i) - close(pipes[j][1]); - } -} + pid_t pid; -static void setup_pipe_redirection(int i, int num_cmds, int pipes[][2]) -{ - if (i > 0) + if (cmd->fd_in == -1 || cmd->fd_out == -1) { - if (dup2(pipes[i - 1][0], STDIN_FILENO) == -1) - { - perror("dup2"); - exit(EXIT_FAILURE); - } + g_mini->exit_status = 1; + return ; } - if (i < num_cmds - 1) + pid = fork(); + if (pid == 0) { - if (dup2(pipes[i][1], STDOUT_FILENO) == -1) - { - perror("dup2"); - exit(EXIT_FAILURE); - } + close_pipes_in_child(num_cmds, pipes, i); + handle_child(cmd, pipes, i, num_cmds); } -} - -static void wait_for_children(int num_cmds) -{ - int status; - - while (--num_cmds >= 0) + else if (pid < 0) { - wait(&status); - if (WIFEXITED(status)) - g_mini->exit_status = WEXITSTATUS(status); - else if (WIFSIGNALED(status)) - g_mini->exit_status = 1; + perror("fork"); + g_mini->exit_status = 1; } } @@ -145,61 +64,26 @@ void exec_pipes(t_list *commands) { int num_cmds; int pipes[128][2]; - pid_t pid; int i; t_cmd *cmd; num_cmds = ft_lstsize(commands); - i = 0; create_pipes(num_cmds, pipes); + i = 0; while (i < num_cmds) { cmd = (t_cmd *)commands->content; - if ((pid = fork()) == 0) + if (is_builtin(cmd) && num_cmds == 1) { - setup_pipe_redirection(i, num_cmds, pipes); - close_pipes_in_child(num_cmds, pipes, i); - child_process(cmd); - } - else if (pid < 0) - { - perror("fork"); - g_mini->exit_status = 1; + cmd->pipe_fd = cmd->fd_out; + execute_builtin(cmd); + return ; } + fork_and_execute(cmd, pipes, i, num_cmds); commands = commands->next; i++; } close_pipes_in_parent(num_cmds, pipes); wait_for_children(num_cmds); -} - -void *check_to_fork(t_list *commands) -{ - t_cmd *cmd; - DIR *dir; - - - cmd = (t_cmd *)commands->content; - if ((dir = opendir(cmd->full_command[0])) != NULL) - { - closedir(dir); - ft_error_with_exit(4, cmd->full_command[0], 126, "Is a directory\n"); - return (NULL); - } - if (is_builtin(cmd)) - { - execute_builtin(cmd); - return (NULL); - } - cmd->command_path = resolve_command_path(cmd->full_command[0]); - if (cmd->command_path && access(cmd->command_path, F_OK) == -1) - { - ft_error_with_exit(3, cmd->full_command[0], 127, "No such file or directory\n"); - return (NULL); - } - if (cmd->command_path && access(cmd->command_path, X_OK) == 0) - exec_pipes(commands); - else - ft_error_with_exit(4, cmd->full_command[0], 127, "command not found\n"); - return (NULL); + ft_lstclear(&commands, free_cmd); } diff --git a/src/env/path_resolution.c b/src/exec/path_utils.c similarity index 61% rename from src/env/path_resolution.c rename to src/exec/path_utils.c index 6590517..35768a5 100644 --- a/src/env/path_resolution.c +++ b/src/exec/path_utils.c @@ -1,63 +1,67 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* path_resolution.c :+: :+: :+: */ +/* path_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ +/* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/07/16 15:23:12 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 17:32:20 by Jskehan ### ########.fr */ +/* Created: 2024/08/16 15:33:20 by Jskehan #+# #+# */ +/* Updated: 2024/08/22 13:08:53 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -char *resolve_command_path(char *command) +char *check_direct_command(char *command) +{ + if (access(command, F_OK) == -1) + return (ft_error_with_exit(command, 127, "No such file or directory\n"), + NULL); + if (access(command, X_OK) == -1) + return (ft_error_with_exit(command, 126, "Permission denied\n"), NULL); + return (strdup(command)); +} + +char *try_paths(char **paths, char *command) { - char *path_env; - char **paths; char *cmd_path; int i; - if (command[0] == '/' || command[0] == '.') - { - if (access(command, X_OK) == 0) - return (strdup(command)); - return (g_mini->exit_status = 126, NULL); - } - path_env = find_var("PATH"); - if (!path_env) - return (NULL); - paths = ft_split(path_env, ':'); - free(path_env); - if (!paths) - return (NULL); i = 0; while (paths[i]) { cmd_path = ft_strjoin(paths[i], "/"); if (!cmd_path) - { - ft_free_2d_array(&paths); return (NULL); - } cmd_path = ft_strjoin_free(cmd_path, command); if (!cmd_path) - { - ft_free_2d_array(&paths); return (NULL); - } if (access(cmd_path, X_OK) == 0) - { - // printf("Command path found: %s\n", cmd_path); // Debug print - ft_free_2d_array(&paths); return (cmd_path); - } free(cmd_path); i++; } - ft_free_2d_array(&paths); - // g_mini->exit_status = 127; - // printf("Command path not found for: %s\n", command); // Debug print return (NULL); } + +char *resolve_command_path(char *command) +{ + char *path_env; + char **paths; + char *cmd_path; + + if (command[0] == '/' || command[0] == '.') + return (check_direct_command(command)); + path_env = find_var("PATH"); + if (!path_env) + return (NULL); + paths = ft_split(path_env, ':'); + free(path_env); + if (!paths) + return (NULL); + cmd_path = try_paths(paths, command); + ft_free_2d_array(&paths); + if (!cmd_path) + ft_error_with_exit(command, 127, "command not found\n"); + return (cmd_path); +} diff --git a/src/exec/pipe_utils.c b/src/exec/pipe_utils.c new file mode 100644 index 0000000..284215d --- /dev/null +++ b/src/exec/pipe_utils.c @@ -0,0 +1,74 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pipe_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/16 15:32:44 by Jskehan #+# #+# */ +/* Updated: 2024/08/16 16:21:39 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void create_pipes(int num_cmds, int pipes[][2]) +{ + int i; + + i = -1; + while (++i < num_cmds - 1) + { + if (pipe(pipes[i]) == -1) + { + perror("pipe"); + exit(EXIT_FAILURE); + } + } +} + +void close_pipes_in_parent(int num_cmds, int pipes[][2]) +{ + int i; + + i = -1; + while (++i < num_cmds - 1) + { + close(pipes[i][0]); + close(pipes[i][1]); + } +} + +void close_pipes_in_child(int num_cmds, int pipes[][2], int i) +{ + int j; + + j = -1; + while (++j < num_cmds - 1) + { + if (j != i - 1) + close(pipes[j][0]); + if (j != i) + close(pipes[j][1]); + } +} + +void setup_pipe_redirection(int i, int num_cmds, int pipes[][2]) +{ + if (i > 0) + { + if (dup2(pipes[i - 1][0], STDIN_FILENO) == -1) + { + perror("dup2"); + exit(EXIT_FAILURE); + } + } + if (i < num_cmds - 1) + { + if (dup2(pipes[i][1], STDOUT_FILENO) == -1) + { + perror("dup2"); + exit(EXIT_FAILURE); + } + } +} diff --git a/src/init/initilisation.c b/src/init/initilisation.c index 6e1c6c5..a3de5de 100644 --- a/src/init/initilisation.c +++ b/src/init/initilisation.c @@ -3,30 +3,25 @@ /* ::: :::::::: */ /* initilisation.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ +/* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/25 15:18:28 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 18:05:59 by Jskehan ### ########.fr */ +/* Updated: 2024/08/23 13:06:37 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" - -void initialize_envp(char **envp) +static void initialize_basic_env(char **envp) { char cwd[PATH_MAX]; - char *shlvl_str; - int shlvl; g_mini->envp = copy_env(envp); if (!g_mini->envp) { - // Handle memory allocation failure perror("Failed to initialize environment variables"); exit(EXIT_FAILURE); } - // Set any additional required environment variables if (getcwd(cwd, sizeof(cwd))) { g_mini->envp = ft_setenv("PWD", cwd, g_mini->envp, 1); @@ -37,22 +32,29 @@ void initialize_envp(char **envp) } } g_mini->envp = ft_setenv("SHELL", "jackoshell", g_mini->envp, 1); +} + +static void set_shell_level(void) +{ + char *shlvl_str; + int shlvl; + char *shlvl_value; - // Handle SHLVL shlvl_str = ft_getenv("SHLVL", g_mini->envp, strlen("SHLVL")); if (shlvl_str) - { shlvl = atoi(shlvl_str) + 1; - } else - { shlvl = 1; - } - char shlvl_value[12]; - snprintf(shlvl_value, sizeof(shlvl_value), "%d", shlvl); + shlvl_value = ft_itoa(shlvl); g_mini->envp = ft_setenv("SHLVL", shlvl_value, g_mini->envp, 1); + free(shlvl_value); } +void initialize_envp(char **envp) +{ + initialize_basic_env(envp); + set_shell_level(); +} t_cmd *init_cmd(void) { @@ -68,6 +70,7 @@ t_cmd *init_cmd(void) node->is_heredoc = 0; node->is_append = 0; node->mini = g_mini; + node->pipe_fd = 1; return (node); } diff --git a/src/main.c b/src/main.c index a42f5a1..474b095 100644 --- a/src/main.c +++ b/src/main.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* main.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ +/* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/15 20:09:06 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 18:10:54 by Jskehan ### ########.fr */ +/* Updated: 2024/08/22 14:15:43 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,22 +26,10 @@ int main(int argc, char **argv, char **envp) perror("Failed to allocate t_mini structure"); exit(EXIT_FAILURE); } - g_mini = mini; initialize_envp(envp); init_mini(mini); - - setup_signal_handlers(); - //--------------TESTING---------------- - // test_exec(); - // test_heredoc(); - // libft_extra_tester(); - //--------------!TESTING---------------- - // printf("%s\n", MINISHELL_ASCII); prompt_loop(); - // char *str = get_next_line(0); - // printf("%s\n", str); - // free(str); free_mini(&g_mini); return (EXIT_SUCCESS); } diff --git a/src/parser/expand_vars.c b/src/parser/expand_vars.c index 0ac0116..99c5b3b 100644 --- a/src/parser/expand_vars.c +++ b/src/parser/expand_vars.c @@ -6,12 +6,38 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/07 17:40:44 by iverniho #+# #+# */ -/* Updated: 2024/08/15 13:40:53 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +char *replace_env_variables(char *str) +{ + char *env_value; + char *result; + int index[3]; + + result = (char *)malloc(strlen(str) * 2 + 1); + if (!result) + return (0); + index[0] = ((index[1] = 0), (env_value = NULL), 0); + while (str[index[0]]) + { + if (str[index[0]] == '$') + { + index[0]++; + index[2] = 0; + manage_replacing(index, str, &env_value); + if (env_value) + index[1] = if_env(env_value, str, &result, index); + } + else + result[index[1]++] = str[index[0]++]; + } + result[index[1]] = '\0'; + return (result); +} + char *find_var(char *var) { int i; @@ -40,55 +66,30 @@ char **replace_var(char *var, char **tokenizedInput) { char **expanded_array; int i; - char *var_value; char *trimmed; i = -1; - expanded_array = ft_calloc(ft_2d_array_len(tokenizedInput) + 1, \ - sizeof(char *)); + expanded_array = ft_calloc(ft_2d_array_len(tokenizedInput) + 1, + sizeof(char *)); if (!expanded_array) return (NULL); while (tokenizedInput[++i]) { trimmed = remove_quotes(tokenizedInput[i], '\"'); - if ((trimmed[0] != '$' && trimmed[1] != '$') || trimmed[1] == '\0') - expanded_array[i] = ft_strdup(tokenizedInput[i]); - else + if (ft_strchr(trimmed, '$') == NULL || trimmed[1] != '\0') { - var_value = find_var(var); - if (var_value) - expanded_array[i] = var_value; - else + expanded_array[i] = \ + ft_strdup(replace_env_variables(tokenizedInput[i])); + if (ft_strchr(expanded_array[i], '$') != NULL + && ft_strcmp(expanded_array[i], tokenizedInput[i]) == 0) expanded_array[i] = ft_strdup(" "); } + else + expanded_array[i] = ft_strdup(tokenizedInput[i]); } return (free(var), expanded_array); } -char **remove_empty_elements(char **arr) -{ - int i; - int j; - char **new_arr; - - i = 0; - j = 0; - new_arr = ft_calloc(ft_2d_array_len(arr) + 1, sizeof(char *)); - if (!new_arr) - return (NULL); - while (arr[i]) - { - if (arr[i][0] != ' ') - { - new_arr[j] = ft_strdup(arr[i]); - j++; - } - i++; - } - ft_free_2d_array(&arr); - return (new_arr); -} - char **find_env_var_and_replace(char *var, char **tokenizedInput) { char *tmp_var; @@ -108,7 +109,7 @@ char **find_env_var_and_replace(char *var, char **tokenizedInput) else { while (*tmp) - tmp_var[j++] = *++tmp; + tmp_var[j++] = *tmp++; tmp_var[j] = '\0'; } res = replace_var(tmp_var, tokenizedInput); @@ -131,6 +132,10 @@ char **expand_vars(char **tokenizedInput) last_str = ((i = -1), temp_token_array); while (temp_token_array[++i]) { + /*if (has_single_quoting(temp_token_array[i]) && i == 0) + i++; + if (ft_strchr(temp_token_array[i], '$') != NULL + && !has_single_quoting(temp_token_array[i]))*/ if (has_single_quoting(temp_token_array[i]) && i == 0 && \ ft_2d_array_len(temp_token_array) > 1) i++; diff --git a/src/parser/expand_vars_utils.c b/src/parser/expand_vars_utils.c index f6e4735..4f66112 100644 --- a/src/parser/expand_vars_utils.c +++ b/src/parser/expand_vars_utils.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/09 13:50:12 by iverniho #+# #+# */ -/* Updated: 2024/08/12 17:31:51 by iverniho ### ########.fr */ +/* Updated: 2024/08/21 19:53:46 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,7 +27,6 @@ char *remove_quotes(char *str, char q) i = 0; while (i < len) { - // if (str[i] != '\"') if (str[i] != q) result[j++] = str[i]; i++; @@ -45,3 +44,27 @@ char **manage_replaced(char **replaced, char **last_str) ft_free_2d_array(&replaced); return (last_str); } + +char **remove_empty_elements(char **arr) +{ + int i; + int j; + char **new_arr; + + i = 0; + j = 0; + new_arr = ft_calloc(ft_2d_array_len(arr) + 1, sizeof(char *)); + if (!new_arr) + return (NULL); + while (arr[i]) + { + if (arr[i][0] != ' ') + { + new_arr[j] = ft_strdup(arr[i]); + j++; + } + i++; + } + ft_free_2d_array(&arr); + return (new_arr); +} diff --git a/src/parser/expand_vars_utils1.c b/src/parser/expand_vars_utils1.c index 3a138ab..792b369 100644 --- a/src/parser/expand_vars_utils1.c +++ b/src/parser/expand_vars_utils1.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* expand_vars_utils1.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: iverniho +#+ +:+ +#+ */ +/* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/12 20:31:00 by iverniho #+# #+# */ -/* Updated: 2024/08/12 20:31:49 by iverniho ### ########.fr */ +/* Updated: 2024/08/21 17:31:18 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,8 +22,8 @@ int calculate_new_length(const char *input, int replacement_len) input_len = ((new_len = 0), (i = 0), ft_strlen(input)); while (i < input_len) { - if (input[i] == '?' || (input[i] == '$' && \ - i + 1 < input_len && input[i + 1] == '?')) + if (input[i] == '?' || (input[i] == '$' && i + 1 < input_len && input[i \ + + 1] == '?')) { new_len += replacement_len; if (input[i] == '$') @@ -41,8 +41,8 @@ int calculate_new_length(const char *input, int replacement_len) } // Function to replace special signs and build the new string -void replace_and_build(const char *input, char *output, \ - const char *replacement_value) +void replace_and_build(const char *input, char *output, + const char *replacement_value) { int input_len; int replacement_len; @@ -54,8 +54,8 @@ void replace_and_build(const char *input, char *output, \ replacement_len = strlen(replacement_value); while (i < input_len) { - if (input[i] == '?' || (input[i] == '$' && \ - i + 1 < input_len && input[i + 1] == '?')) + if (input[i] == '?' || (input[i] == '$' && i + 1 < input_len && input[i \ + + 1] == '?')) { k = 0; while (k < replacement_len) diff --git a/src/parser/expand_vars_utils2.c b/src/parser/expand_vars_utils2.c new file mode 100644 index 0000000..3309760 --- /dev/null +++ b/src/parser/expand_vars_utils2.c @@ -0,0 +1,86 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expand_vars_utils2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: iverniho +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/21 19:51:04 by iverniho #+# #+# */ +/* Updated: 2024/08/21 19:51:34 by iverniho ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *handle_sprintf(int *src_idx) +{ + char *env_value; + + env_value = ft_strdup(ft_itoa(g_mini->exit_status)); + *src_idx += 1; + return (env_value); +} + +void getenv_handler(char **env_value, int len, int *k) +{ + (*env_value) = (char *)malloc(len); + (*env_value)[++(*k)] = '$'; +} + +char *imp_while1(char *str, int *src_idx, int *var_idx) +{ + char *env_value; + char var_name[100]; + int j; + int k; + + while (str[(*src_idx)] && (ft_isalnum(str[(*src_idx)]) + || str[(*src_idx)] == '_')) + { + var_name[(*var_idx)++] = str[(*src_idx)++]; + var_name[(*var_idx)] = '\0'; + env_value = getenv(var_name); + if (env_value) + break ; + } + var_name[(*var_idx)] = '\0'; + env_value = ((j = -1), (k = -1), NULL); + env_value = getenv(var_name); + if (!env_value) + { + getenv_handler(&env_value, ft_strlen(var_name), &k); + while (var_name[++j]) + env_value[++k] = var_name[j]; + env_value[++k] = '\0'; + } + return (env_value); +} + +int if_env(char *env_value, char *str, char **result, int *index) +{ + int env_len; + + if (env_value) + { + env_len = strlen(env_value); + if (index[1] + env_len >= (int)ft_strlen(str) * 2) + { + (*result) = ft_realloc((*result), index[1] + env_len + 1); + if (!(*result)) + return (0); + } + while (*env_value) + (*result)[index[1]++] = *env_value++; + } + else + (*result)[index[1]++] = str[index[0]++]; + return (index[1]); +} + +void manage_replacing(int *index, char *str, char **env_value) +{ + if (str[index[0]] == '?') + (*env_value) = handle_sprintf(&index[0]); + else + (*env_value) = imp_while1(str, &index[0], &index[2]); +} diff --git a/src/parser/input.c b/src/parser/input.c index 4f3bfa6..c4a4424 100644 --- a/src/parser/input.c +++ b/src/parser/input.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* input.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: iverniho +#+ +:+ +#+ */ +/* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/09 17:20:49 by Jskehan #+# #+# */ -/* Updated: 2024/08/12 15:54:40 by iverniho ### ########.fr */ +/* Updated: 2024/08/26 18:34:01 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,8 +26,8 @@ static int check_tokenized_input(char **tokenized_input) if (len < 0) len = 0; if (j == 1 && is_special_char_input(tokenized_input[i][len]) == 1 - && is_string_quoted(tokenized_input[i]) != 1) - return (ft_error(6, tokenized_input[i]), 0); + && ft_is_string_quoted(tokenized_input[i]) != 1) + return (0); j = is_special_char_input(tokenized_input[i][len]); if (tokenized_input[i][0] == '|') j = 0; @@ -38,23 +38,22 @@ static int check_tokenized_input(char **tokenized_input) void handle_input(char *input) { char **tokenized_input; - t_list *commands; tokenized_input = tokenize_input(input); if (!tokenized_input || !tokenized_input[0] || !check_tokenized_input(tokenized_input)) { + ft_free_2d_array(&tokenized_input); free(input); - if (tokenized_input) - ft_free_2d_array(&tokenized_input); return ; } - commands = create_nodes(tokenized_input); - if (commands) + g_mini->node = create_commands(tokenized_input); + ft_free_2d_array(&tokenized_input); + if (g_mini->node) { - check_to_fork(commands); - ft_lstclear(&commands, free_cmd); + exec_pipes(g_mini->node); + ft_lstclear(&g_mini->node, free_cmd); } - ft_free_2d_array(&tokenized_input); + ft_lstclear(& g_mini->node, free_cmd); free(input); } diff --git a/src/parser/node.c b/src/parser/node.c index d13f3a2..36c4083 100644 --- a/src/parser/node.c +++ b/src/parser/node.c @@ -6,49 +6,89 @@ /* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/09 17:21:00 by Jskehan #+# #+# */ -/* Updated: 2024/08/09 17:41:23 by Jskehan ### ########.fr */ +/* Updated: 2024/08/26 18:28:18 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -static int handle_command_node(char **input, t_list **commands, - t_list **cur_command, int *i) +int validate_command(t_cmd *cmd) { - *cur_command = ft_lstlast(*commands); - if (*i == 0 || (input[*i][0] == '|' && input[*i + 1] && input[*i + 1][0])) + if (cmd->fd_in == -1 || cmd->fd_out == -1) { - ft_lstadd_back(commands, ft_lstnew(init_cmd())); - *cur_command = ft_lstlast(*commands); + g_mini->exit_status = 1; + return (1); } - (*cur_command)->content = set_redir((*cur_command)->content, input[*i], - input, i); - if (!(*cur_command)->content) - return (ft_lstclear(commands, free), -1); return (1); } -t_list *create_nodes(char **input) +static char **process_command(t_cmd *cmd, char **tokenized_input) { - t_list *commands; - t_list *cur_command; - int i; - - commands = NULL; - cur_command = NULL; - i = -1; - while (input && input[++i]) + char **new_array; + + new_array = ft_add_row_2d_array(cmd->full_command, *tokenized_input, 0); + if (!new_array) { - if (handle_command_node(input, &commands, &cur_command, &i) == -1) - { - return (g_mini->exit_status = 1, NULL); - } - if (i == -2) - { - ft_lstclear(&commands, free_cmd); - ft_free_2d_array(&input); + free_cmd(cmd); + return (NULL); + } + cmd->full_command = new_array; + return (tokenized_input + 1); +} + +static char **process_token(t_cmd *cmd, char **tokenized_input, + int *error_status) +{ + if (is_redirection(ft_remove_paired_quotes(*tokenized_input))) + { + *error_status = process_redirections(cmd, &tokenized_input); + if (*error_status) return (NULL); + return (tokenized_input); + } + else + return (process_command(cmd, tokenized_input)); +} + +t_cmd *create_command_node(char **tokenized_input) +{ + t_cmd *cmd; + int error_status; + + error_status = 0; + cmd = initialize_command(); + if (!cmd) + return (NULL); + while (*tokenized_input && **tokenized_input != '|') + { + tokenized_input = process_token(cmd, tokenized_input, &error_status); + if (!tokenized_input) + break ; + } + validate_command(cmd); + return (cmd); +} + +t_list *create_commands(char **tokenized_input) +{ + t_cmd *cmd; + + while (*tokenized_input) + { + cmd = create_command_node(tokenized_input); + if (!cmd) + { + while (*tokenized_input && **tokenized_input != '|') + tokenized_input++; + if (*tokenized_input) + tokenized_input++; + continue ; } + ft_lstadd_back(&g_mini->node, ft_lstnew(cmd)); + while (*tokenized_input && **tokenized_input != '|') + tokenized_input++; + if (*tokenized_input) + tokenized_input++; } - return (commands); + return (g_mini->node); } diff --git a/src/parser/node_utils.c b/src/parser/node_utils.c new file mode 100644 index 0000000..ccdaf61 --- /dev/null +++ b/src/parser/node_utils.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* node_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/21 17:06:03 by Jskehan #+# #+# */ +/* Updated: 2024/08/21 17:07:13 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_cmd *initialize_command(void) +{ + t_cmd *cmd; + + cmd = init_cmd(); + if (!cmd) + return (NULL); + cmd->full_command = ft_calloc(1, sizeof(char *)); + if (!cmd->full_command) + { + free(cmd); + return (NULL); + } + return (cmd); +} diff --git a/src/parser/parser_utils.c b/src/parser/parser_utils.c index 16c703c..f99a32a 100644 --- a/src/parser/parser_utils.c +++ b/src/parser/parser_utils.c @@ -6,7 +6,7 @@ /* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/07 17:38:35 by iverniho #+# #+# */ -/* Updated: 2024/08/09 16:56:10 by Jskehan ### ########.fr */ +/* Updated: 2024/08/21 17:29:36 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ @@ -81,8 +81,7 @@ char *ft_trimm_quotes(char const *s1, int s_quote, int d_quote) { s_quote = (s_quote + (!d_quote && *s1 == '\'')) % 2; d_quote = (d_quote + (!s_quote && *s1 == '\"')) % 2; - if ((*s1 != '\"' || s_quote) && (*s1 != '\'' || d_quote) \ - && ++i >= 0) + if ((*s1 != '\"' || s_quote) && (*s1 != '\'' || d_quote) && ++i >= 0) trimmed[i] = *s1; s1++; } @@ -106,4 +105,3 @@ char **ft_remove_quotes(char **tokenizedInput) } return (temp); } - diff --git a/src/parser/tokenization.c b/src/parser/tokenization.c index 7286cbf..a6c7624 100644 --- a/src/parser/tokenization.c +++ b/src/parser/tokenization.c @@ -3,139 +3,79 @@ /* ::: :::::::: */ /* tokenization.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: iverniho +#+ +:+ +#+ */ +/* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/07 17:46:05 by iverniho #+# #+# */ -/* Updated: 2024/08/12 15:52:38 by iverniho ### ########.fr */ +/* Updated: 2024/08/26 18:45:45 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -// Populate Token Array Function -char **populate_token_array(char **tokenizedInput, char *input) +static char *get_next_token(const char **str) { - int k; - int quote[2]; - int begin; - int end; + const char *start; + char *token; + int in_single_quote; + int in_double_quote; - quote[0] = ((quote[1] = 0, begin = 0, end = 0), k = 0); - while (input[end]) + in_single_quote = 0; + in_double_quote = 0; + while (**str && ft_is_space(**str)) + (*str)++; + start = *str; + while (**str && (!ft_is_space(**str) || in_single_quote || in_double_quote)) { - while (ft_strchr(" ", input[end]) && input[end] != '\0') - end++; - begin = end; - while ((!ft_strchr(" ", input[end]) || quote[0] || quote[1]) - && input[end]) - { - quote[0] = (quote[0] + (!quote[1] && input[end] == '\'')) % 2; - quote[1] = (quote[1] + (!quote[0] && input[end] == '\"')) % 2; - end++; - } - if (begin >= (int)ft_strlen(input)) - tokenizedInput[k++] = "\0"; - else - tokenizedInput[k++] = ft_substr(input, begin, end - begin); + if (**str == '\'' && !in_double_quote) + in_single_quote = !in_single_quote; + else if (**str == '\"' && !in_single_quote) + in_double_quote = !in_double_quote; + (*str)++; } - tokenizedInput[k] = NULL; - return (tokenizedInput); + token = strndup(start, *str - start); + return (token); } -char **tokenize_sp_symb(const char *str, int i, int token_count) +static char **split_spaces(const char *str, int token_count) { char **tokens; - int c[6]; - int start; + int i; - tokens = ((c[3] = i), ft_calloc(100, sizeof(char *))); + if (!str) + return (NULL); + token_count = count_tokens(str); + tokens = (char **)malloc((token_count + 1) * sizeof(char *)); if (!tokens) return (NULL); - while (c[3] < (int)ft_strlen(str) && ++token_count <= 1000) + i = 0; + while (i < token_count) { - if (ft_is_special_symbol(str[c[3]])) - { - define_symbol_len(&c[0], str[c[3]], str[c[3] + 1]); - allocate_and_copy_token1(tokens, token_count, str, c); - c[3] += c[0]; - } - else - { - imp_while(&c[3], ft_strlen(str), str, &start); - c[4] = start; - c[5] = c[3] - c[4]; - allocate_and_copy_token2(tokens, token_count, str, c); - } + tokens[i] = get_next_token(&str); + i++; } + tokens[i] = NULL; return (tokens); } -static char **process_special_symb(char *token, char **tempTokenArr, int *i) -{ - char **sp_sym_arr; - int j; - - sp_sym_arr = ft_splice_2d_array(NULL, tokenize_sp_symb(token, 0, -1), 0); - if (!sp_sym_arr) - return (ft_free_2d_array(&tempTokenArr), NULL); - j = -1; - while (sp_sym_arr[++j]) - add_special_row(&tempTokenArr, sp_sym_arr[j], i); - free(sp_sym_arr); - return (tempTokenArr); -} - -static char **process_expanded_array(char **expandedArray, char **tmpTokArr) -{ - int i; - - i = -1; - while (expandedArray[++i]) - { - if (is_string_quoted(expandedArray[i])) - tmpTokArr = ft_add_row_2d_array1(tmpTokArr, expandedArray[i]); - else if (ft_1st_char_in_set_i(expandedArray[i], "<>|") != -1 - && !ft_is_only_special(expandedArray[i])) - { - tmpTokArr = process_special_symb(expandedArray[i], tmpTokArr, &i); - if (!tmpTokArr) - return (NULL); - i -= 2; - } - else - { - // if (expandedArray[i][0] != ' ') - // tmpTokArr = ft_add_row_2d_array(tmpTokArr, expandedArray[i], 0); - tmpTokArr = ft_add_row_2d_array(tmpTokArr, expandedArray[i], 0); - } - } - return (tmpTokArr); -} - char **tokenize_input(char *input) { char **tok_input; char **expanded_arr; - char **temp_token_arr; - char *trimmed_input; + char **final_tokens; - temp_token_arr = NULL; - trimmed_input = ft_strtrim(input, " "); - tok_input = split_spaces(trimmed_input, w_count_quotes(trimmed_input)); - free(trimmed_input); + tok_input = split_spaces(input, w_count_quotes(input)); if (!tok_input) return (NULL); - expanded_arr = expand_vars(tok_input); + expanded_arr = expand_vars(ft_remove_quotes(tok_input)); if (!expanded_arr) - return (ft_free_2d_array(&tok_input), NULL); - temp_token_arr = process_expanded_array(expanded_arr, temp_token_arr); - if (!temp_token_arr) { - ft_free_2d_array(&expanded_arr); ft_free_2d_array(&tok_input); return (NULL); } + final_tokens = process_expanded_array(expanded_arr, NULL); ft_free_2d_array(&expanded_arr); ft_free_2d_array(&tok_input); - return (ft_add_row_2d_array(temp_token_arr, NULL, 1)); + if (!final_tokens) + return (NULL); + return (ft_add_row_2d_array(final_tokens, NULL, 1)); } diff --git a/src/parser/tokenization2.c b/src/parser/tokenization2.c new file mode 100644 index 0000000..bc862f7 --- /dev/null +++ b/src/parser/tokenization2.c @@ -0,0 +1,100 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tokenization2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: Jskehan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/08 12:33:17 by iverniho #+# #+# */ +/* Updated: 2024/08/21 17:24:25 by Jskehan ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static char *handle_special_symbol(const char *str, int *i) +{ + int len; + char *token; + + len = 1; + if ((str[*i] == '>' || str[*i] == '<') && str[*i + 1] == str[*i]) + len++; + token = ft_substr(str, *i, len); + *i += len; + return (token); +} + +char **tokenize_sp_symb(const char *str, int i, int token_count) +{ + char **tokens; + int start; + + tokens = malloc(100 * sizeof(char *)); + if (!tokens) + return (NULL); + while (str[i] && token_count < 100) + { + if (ft_is_special_symbol(str[i])) + tokens[token_count++] = handle_special_symbol(str, &i); + else + { + start = i; + while (str[i] && !ft_is_special_symbol(str[i])) + i++; + tokens[token_count++] = ft_substr(str, start, i - start); + } + } + tokens[token_count] = NULL; + return (tokens); +} + +static char **process_special_symbols(char *token, char **tmpTokArr) +{ + char **split_tokens; + int i; + + split_tokens = tokenize_sp_symb(token, 0, 0); + if (!split_tokens) + return (NULL); + i = 0; + while (split_tokens[i]) + { + tmpTokArr = ft_add_row_2d_array(tmpTokArr, split_tokens[i], 0); + if (!tmpTokArr) + { + ft_free_2d_array(&split_tokens); + return (NULL); + } + i++; + } + ft_free_2d_array(&split_tokens); + return (tmpTokArr); +} + +char **process_expanded_array(char **expandedArray, char **tmpTokArr) +{ + int i; + + i = 0; + while (expandedArray[i]) + { + if (ft_is_string_quoted(expandedArray[i])) + tmpTokArr = ft_add_row_2d_array(tmpTokArr, expandedArray[i], 0); + else if (ft_contains_special_symbols(expandedArray[i])) + { + tmpTokArr = process_special_symbols(expandedArray[i], tmpTokArr); + if (!tmpTokArr) + return (NULL); + } + else + tmpTokArr = ft_add_row_2d_array(tmpTokArr, expandedArray[i], 0); + if (!tmpTokArr) + { + printf("Error processing token: %s\n", expandedArray[i]); + return (NULL); + } + i++; + } + return (tmpTokArr); +} diff --git a/src/parser/tokenization_utils.c b/src/parser/tokenization_utils.c index 0a538e0..1ef23b2 100644 --- a/src/parser/tokenization_utils.c +++ b/src/parser/tokenization_utils.c @@ -1,79 +1,55 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* tokenization_utils.c :+: :+: :+: */ +/* tokenisation_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: iverniho +#+ +:+ +#+ */ +/* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/08/08 12:33:17 by iverniho #+# #+# */ -/* Updated: 2024/08/08 12:41:09 by iverniho ### ########.fr */ +/* Created: 2024/08/21 17:26:21 by Jskehan #+# #+# */ +/* Updated: 2024/08/21 17:53:05 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void allocate_and_copy_token1(char **tokens, int token_count, \ - const char *str, int c[5]) +static void handle_quote(char c, int *in_quote, char *quote_char) { - tokens[token_count] = ft_calloc(c[0] + 1, sizeof(char)); - if (!tokens[token_count]) - return ; - ft_strlcpy(tokens[token_count], &str[c[3]], c[0] + 1); - tokens[token_count][c[0]] = '\0'; -} - -void allocate_and_copy_token2(char **tokens, \ - int token_count, const char *str, int n[5]) -{ - tokens[token_count] = ft_calloc(n[5] + 1, sizeof(char)); - if (!tokens[token_count]) - return ; - ft_strlcpy(tokens[token_count], &str[n[4]], n[5] + 1); - tokens[token_count][n[5]] = '\0'; + if (*in_quote && c == *quote_char) + *in_quote = 0; + else if (!*in_quote) + { + *in_quote = 1; + *quote_char = c; + } } -void imp_while(int *i, int len, const char *str, int *start) +static const char *skip_spaces(const char *str) { - (*start) = (*i); - while ((*i) < len && !ft_is_space(str[(*i)]) - && !ft_is_special_symbol(str[(*i)])) - (*i)++; + while (*str && ft_is_space(*str)) + str++; + return (str); } -char **ft_add_row_2d_array1(char **array, char *row) +int count_tokens(const char *str) { - int i; - char **new_array; + int count; + int in_quote; + char quote_char; - i = 0; - if (!array) + count = 0; + in_quote = 0; + quote_char = '\0'; + while (*str) { - new_array = ft_calloc(2, sizeof(char *)); - if (!new_array) - return (NULL); - new_array[0] = ft_strdup(row); - new_array[1] = NULL; - return (new_array); + str = skip_spaces(str); + if (*str) + count++; + while (*str && (!ft_is_space(*str) || in_quote)) + { + if (ft_is_quote(*str)) + handle_quote(*str, &in_quote, "e_char); + str++; + } } - while (array[i]) - i++; - new_array = ft_calloc(i + 2, sizeof(char *)); - if (!new_array) - return (NULL); - i = -1; - while (array[++i]) - new_array[i] = ft_strdup(array[i]); - new_array[i] = ft_strdup(row); - new_array[i + 1] = NULL; - ft_free_2d_array(&array); - return (new_array); -} - -// Add Special Row Function -void add_special_row(char ***tempTokenArray, char *specialSymbolArray, \ - int *i) -{ - *tempTokenArray = ft_add_row_2d_array(*tempTokenArray, specialSymbolArray, - 0); - *i += 1; + return (count); } diff --git a/src/redirect/here_doc.c b/src/redirect/here_doc.c index 526a5fa..6ec5136 100644 --- a/src/redirect/here_doc.c +++ b/src/redirect/here_doc.c @@ -6,85 +6,32 @@ /* By: Jskehan +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/10 14:19:34 by Jskehan #+# #+# */ -/* Updated: 2024/08/12 09:38:17 by Jskehan ### ########.fr */ +/* Updated: 2024/08/19 10:49:11 by Jskehan ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -static char *read_string_until_limit(const char *limit, const char *warn) +int get_here_doc(const char *delimiter) { - char *str; - char *temp; + int pipefd[2]; char *line; - str = NULL; - while (g_mini->exit_status != 130) + if (pipe(pipefd) == -1) { - line = readline("> "); - if (!line) - { - printf("%s (wanted `%s`)\n", warn, limit); - break ; - } - if (strcmp(line, limit) == 0) - { - free(line); - break ; - } - temp = str; - str = ft_strjoin(str, line); - str = ft_strjoin(str, "\n"); - free(temp); - free(line); - } - return (str); -} - -int get_here_doc(const char *limit, const char *warn) -{ - int fd[2]; - char *str; - - g_mini->exit_status = 0; - if (pipe(fd) == -1) - { - // mini_perror("PIPERR", NULL, 1); - ft_error_with_exit(4, NULL, 1, "pipe"); + perror("pipe"); return (-1); } - str = read_string_until_limit(limit, warn); - if (str) - ft_putstr_fd(str, fd[WRITE_END]); - free(str); - close(fd[WRITE_END]); - if (g_mini->exit_status == 130) + while (1) { - close(fd[READ_END]); - return (-1); - } - return (fd[READ_END]); -} -t_mini *handle_here_doc(t_list *command, char **args, int *i) -{ - char *nl; - char *warn; - t_cmd *cmd; - - cmd = (t_cmd *)command->content; - warn = "minishell: warning: here-document delimited by end-of-file"; - nl = "minishell: syntax error near unexpected token `newline'"; - (*i)++; - if (args[*i]) - cmd->fd_in = get_here_doc(args[*i], warn); - if (!args[*i] || cmd->fd_in == -1) - { - *i = -1; - if (cmd->fd_in != -1) - { - ft_putendl_fd(nl, 2); - g_mini->exit_status = 2; - } + line = readline("> "); + if (!line || strcmp(line, delimiter) == 0) + break ; + write(pipefd[1], line, strlen(line)); + write(pipefd[1], "\n", 1); + free(line); } - return (g_mini); + free(line); + close(pipefd[1]); + return (pipefd[0]); } diff --git a/src/redirect/redirection.c b/src/redirect/redirection.c index 9c0240e..ee844cb 100644 --- a/src/redirect/redirection.c +++ b/src/redirect/redirection.c @@ -7,16 +7,20 @@ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/10 14:08:23 by Jskehan #+# #+# */ /* Updated: 2024/08/15 13:46:10 by iverniho ### ########.fr */ -/* */ +x/* */ /* ************************************************************************** */ #include "minishell.h" -static int check_access(char *path, int mode) +static t_cmd *handle_append_redir(t_cmd *cmd, char ***input) { - if (mode == 1) + int fd; + + (*input)++; + if (!**input) { - if (access(path, F_OK) == -1) + return (cmd); + /* if (access(path, F_OK) == -1) { ft_error_with_exit(3, path, 127, ": No such file or directory"); return (0); @@ -26,97 +30,106 @@ static int check_access(char *path, int mode) ft_error_with_exit(5, path, 126, ": Permission denied\n"); return (0); } - return (1); + return (1);*/ } - else if (mode == 2) + fd = open(**input, O_WRONLY | O_CREAT | O_APPEND, 0644); + if (fd == -1) { - if (access(path, F_OK) != -1 && access(path, W_OK) == -1) + ft_putstr_fd(ft_strjoin("minishell: ", **input), STDERR_FILENO); + perror(" "); + g_mini->exit_status = 1; + cmd->fd_out = -1; + return (cmd); + /* if (access(path, F_OK) != -1 && access(path, W_OK) == -1) { ft_error_with_exit(5, path, 126, ": Permission denied\n"); return (0); } - return (1); + return (1);*/ } - return (1); + cmd->fd_out = fd; + (*input)++; + return (cmd); } -static int open_file_for_reading(char *path) +static t_cmd *handle_output_redir(t_cmd *cmd, char ***input) { - int fd; + int fd; - fd = open(path, O_RDONLY); + (*input)++; + if (!**input) + { + cmd->fd_out = -1; + return (cmd); + } + fd = open(**input, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd == -1) - ft_error_with_exit(3, path, 127, ": Unable to open for reading"); - return (fd); + { + ft_putstr_fd(ft_strjoin("minishell: ", **input), STDERR_FILENO); + perror(" "); + g_mini->exit_status = 1; + cmd->fd_out = -1; + return (cmd); + } + cmd->fd_out = fd; + (*input)++; + return (cmd); } -static int open_file_for_writing(char *path, int append) +static t_cmd *handle_input_redir(t_cmd *cmd, char ***input) { - int fd; - - if (append) - fd = open(path, O_CREAT | O_WRONLY | O_APPEND, 0666); - else - fd = open(path, O_CREAT | O_WRONLY | O_TRUNC, 0666); + int fd; + (*input)++; + if (!**input) + { + cmd->fd_in = -1; + return (cmd); + } + fd = open(**input, O_RDONLY); if (fd == -1) - ft_error_with_exit(3, path, 127, ": Unable to open for writing"); - - return (fd); -} - -static int determine_fd(t_cmd *cmd, char *path) -{ - if (cmd->is_outfile) - return open_file_for_writing(path, cmd->is_append); - else - return open_file_for_reading(path); -} - -int get_fd(int oldfd, t_cmd *cmd, char *path, int mode) -{ - if (oldfd > 2) - close(oldfd); - if (!path) - return (-1); - if (!check_access(path, mode)) - return (-1); - - if (cmd) - return determine_fd(cmd, path); - else { - if (mode == 1) - return open_file_for_reading(path); - else if (mode == 2) - return open_file_for_writing(path, 0); - else if (mode == 3) - return open_file_for_writing(path, 1); + ft_putstr_fd(ft_strjoin("minishell: ", **input), STDERR_FILENO); + perror(" "); + g_mini->exit_status = 1; + cmd->fd_in = -1; + return (cmd); } - - return (-1); + cmd->fd_in = fd; + (*input)++; + return (cmd); } -t_mini *get_file(t_mini *mini, t_list *command, char **args, int *i) +static t_cmd *handle_heredoc_redir(t_cmd *cmd, char ***input) { - t_cmd *cmd; - - cmd = (t_cmd *)command->content; - (*i)++; - if (args[*i]) + (*input)++; + if (!**input) { - if (cmd->is_outfile) - cmd->fd_out = get_fd(cmd->fd_out, cmd, args[*i], cmd->is_append ? 3 : 2); - else - cmd->fd_in = get_fd(cmd->fd_in, cmd, args[*i], 1); + cmd->fd_in = -1; + return (cmd); } - if (!args[*i] || (cmd->is_outfile ? cmd->fd_out : cmd->fd_in) == -1) + cmd->fd_in = get_here_doc(**input); + if (cmd->fd_in == -1) { - *i = -1; - if ((cmd->is_outfile ? cmd->fd_out : cmd->fd_in) != -1) - g_mini->exit_status = 2; - else - g_mini->exit_status = 1; + cmd->fd_in = -1; + return (cmd); } - return (mini); + cmd->is_heredoc = 1; + (*input)++; + return (cmd); +} + +int process_redirections(t_cmd *cmd, char ***tokenized_input) +{ + if (!*tokenized_input || !**tokenized_input) + return (0); + if ((*tokenized_input)[0][0] == '>' && (*tokenized_input)[0][1] == '>') + cmd = handle_append_redir(cmd, tokenized_input); + else if ((*tokenized_input)[0][0] == '>') + cmd = handle_output_redir(cmd, tokenized_input); + else if ((*tokenized_input)[0][0] == '<' && (*tokenized_input)[0][1] == '<') + cmd = handle_heredoc_redir(cmd, tokenized_input); + else if ((*tokenized_input)[0][0] == '<') + cmd = handle_input_redir(cmd, tokenized_input); + return (cmd->fd_in == -1 || cmd->fd_out == -1); } diff --git a/src/redirect/set_redir_utils.c b/src/redirect/set_redir_utils.c deleted file mode 100644 index 0644ea5..0000000 --- a/src/redirect/set_redir_utils.c +++ /dev/null @@ -1,126 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* set_redir_utils.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/07/16 14:23:13 by Jskehan #+# #+# */ -/* Updated: 2024/08/12 09:38:13 by Jskehan ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -static t_cmd *handle_redirection(t_cmd *node, char **full_command, int **i, - int mode) -{ - if (mode == 2 || mode == 3) - { - if (node->fd_out > 2) - close(node->fd_out); - node->fd_out = get_fd(node->fd_out, NULL, full_command[++(**i)], mode); - if (!full_command[*(*i)] || node->fd_out == -1) - { - **i = -2; - if (node->fd_out != -1) - g_mini->exit_status = 2; - else - g_mini->exit_status = 1; - } - } - else if (mode == 1) - { - if (node->fd_in > 2) - close(node->fd_in); - node->fd_in = get_fd(node->fd_in, NULL, full_command[++(**i)], mode); - if (node->fd_in == -1) - **i = -2; - } - return (node); -} - -static t_cmd *get_redir_heredoc(t_cmd *node, - char **full_command, int **i) -{ - if (!full_command[++(**i)]) - { - **i = -2; - node->fd_in = -1; - ft_error(1, NULL); - return (node); - } - node->fd_in = get_here_doc(full_command[(*(*i))], - "minishell: warning: here-document delimited by end-of-file"); - if (node->fd_in == -1) - { - **i = -2; - node->fd_in = -1; - } - node->is_heredoc = 1; - return (node); -} - -char *remove_1st_and_last_el(char *str) -{ - char *new_str; - int i; - - i = 0; - new_str = ft_calloc(ft_strlen(str) - 1, sizeof(char)); - if (!new_str) - return (NULL); - while (i++ < (int)ft_strlen(str) - 2) - new_str[i - 1] = str[i]; - new_str[i - 1] = '\0'; - return (new_str); -} - -char *remove_paired_quotes(char *str) { - int i = 0, - j = 0; - int single_quote_open = 0, - double_quote_open = 0; - - while (str[i]) { - if (str[i] == '\'' && !double_quote_open) { - single_quote_open = !single_quote_open; - } else if (str[i] == '\"' && !single_quote_open) { - double_quote_open = !double_quote_open; - } else { - str[j++] = str[i]; - } - i++; - } - str[j] = '\0'; - return (str); -} - -t_cmd *set_redir(t_cmd *node, char *input, char **full_command, int *i) -{ - if (input[0]) - { - if (input[0] == '>' && input[1] == '>') - node = handle_redirection(node, full_command, &i, 3); // Append - else if (input[0] == '>') - node = handle_redirection(node, full_command, &i, 2); // Truncate - else if (input[0] == '<' && input[1] == '<') - node = get_redir_heredoc(node, full_command, &i); // Heredoc - else if (input[0] == '<') - node = handle_redirection(node, full_command, &i, 1); // Input - else if (input[0] != '|') - { - if (!is_string_quoted(input)) - node->full_command = ft_add_row_2d_array(node->full_command, input, 0); - else - node->full_command = ft_add_row_2d_array(node->full_command, remove_paired_quotes(input), 0); - } - } - if (node->fd_in == -1 || node->fd_out == -1) - { - ft_free_2d_array(&node->full_command); - free(node); - return (NULL); - } - return (node); -} diff --git a/src/signal/signal.c b/src/signal/signal.c index 4f129e1..48cacb6 100644 --- a/src/signal/signal.c +++ b/src/signal/signal.c @@ -23,6 +23,12 @@ static void handle_signal(int signal) if (!g_mini->signals.is_executing_command) rl_redisplay(); } + else if (signal == SIGQUIT && g_mini->signals.is_executing_command) + { + write(STDOUT_FILENO, "\nQuit\n", 6); + // free_mini(&g_mini); + exit(131); + } // else if (signal == SIGQUIT) // { // // write(STDOUT_FILENO, PROMPT, 11); @@ -36,7 +42,7 @@ static void handle_signal(int signal) // } } -void setup_signal_handlers(void) +void setup_signal_handlers_exec(void) { signal(SIGINT, handle_signal); // signal(SIGQUIT, handle_signal); @@ -44,7 +50,13 @@ void setup_signal_handlers(void) } -void setup_child_signals(void) +void setup_signal_handlers(void) +{ + signal(SIGINT, handle_signal); + signal(SIGQUIT, SIG_IGN); +} + +void setup_child_signals(void) { signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); diff --git a/src/tester/execution_tests.c b/src/tester/execution_tests.c deleted file mode 100644 index 30603f6..0000000 --- a/src/tester/execution_tests.c +++ /dev/null @@ -1,114 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* execution_tests.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/07/09 15:19:41 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 18:01:21 by Jskehan ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -// void test_echo(t_mini *mini) -// { -// char *full_command[] = {"echo", "Hello, world!", NULL}; - -// t_cmd cmd = {.full_command = full_command, -// .command_path = "/bin/echo", // Not used for built-in commands -// .fd_in = 0, // stdin -// .fd_out = 1, // stdout -// .is_heredoc = 0, -// .is_append = 0, -// .is_outfile = 0, -// .mini = mini}; // Add mini pointer - -// t_list node = {.content = &cmd, .next = NULL}; - -// check_to_fork(); -// printf("Exit status for echo: %d\n", mini->exit_status); -// } - -// // Function to test pwd command -// void test_pwd(t_mini *mini) -// { -// char *full_command[] = {"pwd", NULL}; - -// t_cmd cmd = {.full_command = full_command, -// .command_path = "/bin/pwd", // Not used for built-in commands -// .fd_in = 0, // stdin -// .fd_out = 1, // stdout -// .is_heredoc = 0, -// .is_append = 0, -// .is_outfile = 0, -// .mini = mini}; // Add mini pointer - -// t_list node = {.content = &cmd, .next = NULL}; - -// check_to_fork(mini); -// printf("Exit status for pwd: %d\n", mini->exit_status); -// } - -// void test_exec() -// { -// // Hardcoded command -// char *full_command[] = {"/bin/ls", NULL}; - -// t_cmd cmd = {.full_command = full_command, -// .command_path = "/bin/ls", -// .fd_in = 0, // stdin -// .fd_out = 1, // stdout -// .is_heredoc = 0, -// .is_append = 0, -// .is_outfile = 0, -// .mini = NULL}; // Will set mini later - -// // Wrap command in a list node -// t_list node = {.content = &cmd, .next = NULL}; - -// // Mini shell structure -// t_mini mini = {.envp = NULL, // Environment variables (could be set up if needed) -// .node = &node, -// .current_dir = NULL, // Current directory (could be set up if needed) -// .exit_status = 0}; - -// // Set mini pointer in cmd -// cmd.mini = ; - -// // Test the function -// test_echo(); -// test_pwd(); -// check_to_fork(&node); -// printf("Exit status: %d\n", mini.exit_status); -// } - -// void test_heredoc(void) -// { -// t_mini mini; -// char *warn = "Warning: unexpected EOF"; - -// mini.exit_status = 0; -// const char *limit = "pi"; // specify your delimiter here -// int fd = get_here_doc(limit, warn); -// if (fd != -1) -// { -// char buffer[1024]; -// ssize_t nbytes = read(fd, buffer, sizeof(buffer) - 1); -// if (nbytes >= 0) -// { -// buffer[nbytes] = '\0'; -// printf("Here-doc content:\n%s", buffer); -// } -// else -// { -// perror("read"); -// } -// close(fd); -// } -// else -// { -// printf("Here-doc failed\n"); -// } -// } diff --git a/src/tester/libft_extra_tests.c b/src/tester/libft_extra_tests.c deleted file mode 100644 index 8eab0a0..0000000 --- a/src/tester/libft_extra_tests.c +++ /dev/null @@ -1,90 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* libft_extra_tests.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/06/05 20:00:46 by Jskehan #+# #+# */ -/* Updated: 2024/08/05 18:55:00 by Jskehan ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -// void libft_extra_tester(void) -// { -// printf("This is a test\n"); -// char **env = ft_split("PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin", ':'); -// char **path = ft_split("PATH=dasdas=dsdassas=sedsa=as=dsad=sd=as", '='); -// char **empty = NULL; -// printf("\nTEST1\n"); -// ft_print_2d_array_fd(env, 1); -// printf("\nTEST2\n"); -// ft_print_2d_array_fd(path, 1); - -// printf("\nTEST3\n"); -// empty = ft_splice_2d_array(empty, env, 0); -// env = ft_splice_2d_array(env, path, 0); -// env = ft_splice_2d_array(env, path, 0); - -// printf("\n%d\n", ft_2d_array_len(env)); - -// env = ft_add_row_2d_array(env, "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"); -// env = ft_add_row_2d_array(env, "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"); -// ft_print_2d_array_fd(env, 1); -// printf("\n%d\n", ft_2d_array_len(env)); - -// printf("\nTEST4\n"); -// printf("\nempty_len:%d\n", ft_2d_array_len(empty)); -// empty = ft_add_row_2d_array(empty, "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"); -// ft_print_2d_array_fd(empty, 1); - - -// printf("\nTEST5\n"); -// char **tmp = ft_duplicate_2d_array(empty); -// ft_print_2d_array_fd(tmp, 1); - - -// printf("\nTEST6\n"); -// printf("\n%d\n", ft_count_char("hellodsdadaa dkkdskdsa sdda ", 'a')); -// printf("\n%d\n", ft_count_char("hellodsdadaa dkkdskdsa sdda ", ' ')); - -// printf("\nTEST7\n"); -// char **tmp2 = ft_split("1:2:3:4:5:6", ':'); -// printf("\nshould be 6 \n"); -// printf("\n2darraylen: %d\n", ft_2d_array_len(tmp2)); - -// printf("\nTEST8\n"); -// printf("\n%d\n", ft_1st_char_in_set_i("hellodsdadaa dkkdskdsa sdda ", "ael")); - -// printf("\nTEST9\n"); -// printf("\n%d\n", ft_strchr_i("hellodsdadaa dkkdskdsa sdda ", 'a')); - -// printf("\nTEST10\n"); -// printf("\nhere before realloc size:%d\n", ft_2d_array_len(env)); -// env = ft_realloc_2d_array(env, 20); -// printf("\nhere:%d\n", ft_2d_array_len(env)); -// ft_print_2d_array_fd(env, 1); - - -// printf("\nTEST11\n"); -// char **empty2 = NULL; -// empty2 = ft_splice_2d_array(empty2, env, 0); -// ft_print_2d_array_fd(empty2, 1); - -// printf("\nTEST12\n"); -// char **empty3 = NULL; -// empty3 = ft_add_row_2d_array(empty3, "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"); -// empty3 = ft_add_row_2d_array(empty3, "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"); -// empty3 = ft_add_row_2d_array(empty3, "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"); -// empty3 = ft_add_row_2d_array(empty3, "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"); -// ft_print_2d_array_fd(empty3, 1); - -// ft_free_2d_array(&empty3); -// ft_free_2d_array(&empty2); -// ft_free_2d_array(&env); -// ft_free_2d_array(&path); -// ft_free_2d_array(&empty); -// ft_free_2d_array(&tmp); -// } diff --git a/src/utils/error.c b/src/utils/error.c index d355994..6d9eeb3 100644 --- a/src/utils/error.c +++ b/src/utils/error.c @@ -12,9 +12,10 @@ #include "minishell.h" -static void handle_exit(int exit_code, char *arg, const char *message) +void ft_error_with_exit(char *arg, int exit_code, char *message) { - char *quoted_arg; + ft_putstr_fd("minishell: ", STDERR_FILENO); + /*char *quoted_arg; if (message) { @@ -97,7 +98,7 @@ void ft_error_with_exit(int error_code, char *arg, int exit_code, error_info = find_error_info(error_code); if (!error_info) return ; - ft_putstr_fd("minishell> ", STDERR_FILENO); + ft_putstr_fd("minishell> ", STDERR_FILENO);*/ if (arg) { ft_putstr_fd(arg, STDERR_FILENO); @@ -105,8 +106,5 @@ void ft_error_with_exit(int error_code, char *arg, int exit_code, } if (message) ft_putstr_fd(message, STDERR_FILENO); - else if (error_info->message) - ft_putstr_fd(error_info->message, STDERR_FILENO); - // ft_putstr_fd("\n", STDERR_FILENO); can delete I think g_mini->exit_status = exit_code; } diff --git a/src/utils/node_utils.c b/src/utils/node_utils.c deleted file mode 100644 index 096c75e..0000000 --- a/src/utils/node_utils.c +++ /dev/null @@ -1,51 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* node_utils.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/07/09 15:53:09 by Jskehan #+# #+# */ -/* Updated: 2024/07/16 14:33:40 by Jskehan ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -void print_cmd(t_cmd *cmd) -{ - if (!cmd) - return ; - printf("Command Path: %s\n", - cmd->command_path ? cmd->command_path : "NULL"); - if (cmd->full_command) - { - printf("Full Command: "); - for (int i = 0; cmd->full_command[i]; i++) - printf("%s ", cmd->full_command[i]); - printf("\n"); - } - printf("FD In: %d\n", cmd->fd_in); - printf("FD Out: %d\n", cmd->fd_out); - printf("Is Heredoc: %d\n", cmd->is_heredoc); - printf("Is Append: %d\n", cmd->is_append); - printf("Is Outfile: %d\n", cmd->is_outfile); - - printf("Exit Status: %d\n", cmd->mini->exit_status); -} - -void print_nodes(t_list *node) -{ - if (!node) - { - printf("No nodes to print\n"); - return ; - } - while (node) - { - print_cmd((t_cmd *)node->content); - node = node->next; - if (node) - printf("----------\n"); - } -} diff --git a/src/utils/prompt.c b/src/utils/prompt.c index 4496958..c18d4c9 100644 --- a/src/utils/prompt.c +++ b/src/utils/prompt.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* prompt.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: Jskehan +#+ +:+ +#+ */ +/* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/15 21:09:11 by Jskehan #+# #+# */ -/* Updated: 2024/08/09 17:36:43 by Jskehan ### ########.fr */ +/* Updated: 2024/08/22 14:17:44 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,9 +16,9 @@ void prompt_loop(void) { char *input; - setup_signal_handlers(); while (1) { + setup_signal_handlers(); if (g_mini->signals.sigint_received) { g_mini->signals.sigint_received = 0; @@ -35,6 +35,7 @@ void prompt_loop(void) continue ; } g_mini->signals.is_executing_command = 1; + setup_signal_handlers_exec(); handle_input(input); g_mini->signals.is_executing_command = 0; } diff --git a/src/utils/utils.c b/src/utils/utils.c index 2c32ffa..e4c4000 100644 --- a/src/utils/utils.c +++ b/src/utils/utils.c @@ -6,7 +6,7 @@ /* By: iverniho +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/03 16:34:53 by Jskehan #+# #+# */ -/* Updated: 2024/08/09 16:19:25 by iverniho ### ########.fr */ +/* Updated: 2024/08/23 14:25:59 by iverniho ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,10 @@ void free_cmd(void *cmd_ptr) ft_free_2d_array(&(cmd->full_command)); if (cmd->command_path) free(cmd->command_path); + if (cmd->fd_in > 2) + close(cmd->fd_in); + if (cmd->fd_out > 2) + close(cmd->fd_out); free(cmd); } @@ -51,33 +55,33 @@ int is_all_num(char *str) return (1); } -int is_string_quoted(char *str) -{ - int single_quote_open; - int double_quote_open; - int has_quotes; +// int is_string_quoted(const char *str) +// { +// int single_quote_open; +// int double_quote_open; +// int has_quotes; - single_quote_open = ((double_quote_open = 0), (has_quotes = 0), 0); - while (*str) - { - if (*str == '\'' && !double_quote_open) - { - single_quote_open = !single_quote_open; - has_quotes = 1; - } - else if (*str == '\"' && !single_quote_open) - { - double_quote_open = !double_quote_open; - has_quotes = 1; - } - str++; - } - if (single_quote_open || double_quote_open) - return (-1); - if (!has_quotes) - return (0); - return (1); -} +// single_quote_open = ((double_quote_open = 0), (has_quotes = 0), 0); +// while (*str) +// { +// if (*str == '\'' && !double_quote_open) +// { +// single_quote_open = !single_quote_open; +// has_quotes = 1; +// } +// else if (*str == '\"' && !single_quote_open) +// { +// double_quote_open = !double_quote_open; +// has_quotes = 1; +// } +// str++; +// } +// if (single_quote_open || double_quote_open) +// return (-1); +// if (!has_quotes) +// return (0); +// return (1); +// } int is_special_char_input(char c) { @@ -92,3 +96,10 @@ int is_special_char_input(char c) } return (0); } + +void split_handler(char ***temp, char *key_to_compare) +{ + (*temp) = ft_split(key_to_compare, '='); + key_to_compare = ft_strdup((*temp)[0]); + ft_free_2d_array(&(*temp)); +} diff --git a/test_files/invalid_permission b/test_files/invalid_permission index e69de29..b9d4267 100644 --- a/test_files/invalid_permission +++ b/test_files/invalid_permission @@ -0,0 +1,2 @@ +bye +bye