Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge #18

Merged
merged 26 commits into from
Aug 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
compile_commands.json
/minishell_tester/

noperm
20 changes: 9 additions & 11 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
# By: iverniho <[email protected]> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# 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/

Expand All @@ -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) \
Expand Down
4 changes: 4 additions & 0 deletions am.sh
Original file line number Diff line number Diff line change
@@ -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
276 changes: 149 additions & 127 deletions includes/minishell.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
/* By: iverniho <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/14 15:11:41 by iverniho #+# #+# */
/* Updated: 2024/08/15 12:26:46 by iverniho ### ########.fr */
/* */
/* ************************************************************************** */

Expand All @@ -28,7 +27,6 @@
# include <unistd.h>
# include <sys/ioctl.h>


# define PROMPT "minishell> "
# define NEWLINE_ERR "minishell> syntax error near unexpected token `newline'"
# define SYNTAX_ERR "minishell> syntax error near unexpected token "
Expand All @@ -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\
Expand All @@ -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;

/* ************************************************************************** */
/* */
Expand All @@ -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
Loading