From 20037a4609083145c0ad1ed8c801ec257f1a07d3 Mon Sep 17 00:00:00 2001 From: mdev9 Date: Wed, 24 Apr 2024 11:06:03 +0200 Subject: [PATCH] organised functions into multiple files and did some more norming --- Makefile | 8 +-- srcs/env.c | 101 ++++++++++++++++++++++++++++++++++++ srcs/exec_bonus.c | 91 +-------------------------------- srcs/exec_utils.c | 102 +++++++++++++++++++++++++++++++++++++ srcs/export.c | 90 +------------------------------- srcs/free.c | 45 ++++++++++++++++ srcs/minishell.h | 11 +++- srcs/output_redirections.c | 4 +- srcs/utils.c | 34 +------------ todo_list | 13 +++-- 10 files changed, 276 insertions(+), 223 deletions(-) create mode 100644 srcs/env.c create mode 100644 srcs/exec_utils.c create mode 100644 srcs/free.c diff --git a/Makefile b/Makefile index 879994e..f355030 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: marde-vr +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2023/07/28 00:35:01 by tomoron #+# #+# # -# Updated: 2024/04/21 23:58:44 by tomoron ### ########.fr # +# Updated: 2024/04/24 11:00:09 by marde-vr ### ########.fr # # # # **************************************************************************** # @@ -20,6 +20,7 @@ SRCS_RAW = main.c\ is_fd_open.c\ echo.c\ pwd.c\ + env.c\ parsing.c\ debug.c\ env_utils.c\ @@ -39,8 +40,9 @@ SRCS_RAW = main.c\ utils_bonus.c\ signal_handler.c\ parsing_bonus.c\ - exec_bonus.c - + exec_bonus.c\ + exec_utils.c\ + free.c OBJS_DIR = objs/ SRCS_DIR = srcs/ diff --git a/srcs/env.c b/srcs/env.c new file mode 100644 index 0000000..9ca357f --- /dev/null +++ b/srcs/env.c @@ -0,0 +1,101 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* env.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: marde-vr +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/24 10:58:36 by marde-vr #+# #+# */ +/* Updated: 2024/04/24 10:59:12 by marde-vr ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_env *dup_env(t_env *env) +{ + t_env *res; + + res = 0; + while (env) + { + res = env_add_back(res, env->name, env->value); + env = env->next; + } + return (res); +} + +void sort_env(t_env *env) +{ + t_env *tmp; + t_env *start; + char *tmp_str; + + tmp = env; + start = env; + while (tmp) + { + env = start; + while (env) + { + if (ft_strcmp(tmp->name, env->name) < 0) + { + tmp_str = tmp->name; + tmp->name = env->name; + env->name = tmp_str; + tmp_str = tmp->value; + tmp->value = env->value; + env->value = tmp_str; + } + env = env->next; + } + tmp = tmp->next; + } +} + +void print_env_declare(t_msh *msh, t_env *env_orig) +{ + t_env *env; + + env = dup_env(env_orig); + sort_env(env); + if (!msh->out_fd) + msh->out_fd = 1; + while (env) + { + if (strcmp(env->name, "_")) + { + if (env->value && *(env->value)) + ft_printf_fd(msh->out_fd, "declare -x %s=\"%s\"\n", env->name, + env->value); + else + ft_printf_fd(msh->out_fd, "declare -x %s\n", env->name); + } + env = env->next; + } +} + +void delete_from_env(t_msh *msh, char *name) +{ + t_env *tmp_env; + t_env *prev; + + tmp_env = msh->env; + prev = 0; + while (tmp_env) + { + if (!strcmp(name, tmp_env->name)) + { + free(tmp_env->name); + free(tmp_env->value); + if (!prev) + msh->env = tmp_env->next; + else + prev->next = tmp_env->next; + free(tmp_env); + return ; + } + prev = tmp_env; + tmp_env = tmp_env->next; + } +} diff --git a/srcs/exec_bonus.c b/srcs/exec_bonus.c index 77ce2bb..ae8d398 100755 --- a/srcs/exec_bonus.c +++ b/srcs/exec_bonus.c @@ -6,44 +6,12 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/28 13:50:14 by tomoron #+# #+# */ -/* Updated: 2024/04/24 10:44:54 by marde-vr ### ########.fr */ +/* Updated: 2024/04/24 10:49:07 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void get_redirections(t_msh *msh, t_cmd *cmds) -{ - msh->in_type = 0; - msh->out_type = 0; - if (first_is_in_type(cmds)) - { - if (!get_in_type(msh, cmds)) - get_out_type(msh, cmds); - } - else - { - if (!get_out_type(msh, cmds)) - get_in_type(msh, cmds); - } -} - -t_cmd *get_next_command(t_cmd *cmd) -{ - while (cmd) - { - while (cmd && !is_operand_type(cmd)) - cmd = cmd->next; - if (cmd && cmd->cmd_type == AND && !g_return_code) - return (cmd->next); - if (cmd && cmd->cmd_type == OR && g_return_code) - return (cmd->next); - if (cmd) - cmd = cmd->next; - } - return (0); -} - void exec_command_bonus(t_msh *msh, char *cmd_str) { t_cmd *cmds; @@ -115,63 +83,6 @@ void exec_command(t_msh *msh, int i, int cmd_count) remove_command_from_msh(msh); } -int get_cmd_count(t_cmd *cmds) -{ - int nb; - - nb = 0; - while (cmds && !is_operand_type(cmds)) - { - while (cmds && (is_output_type(cmds) || is_input_type(cmds))) - cmds = cmds->next; - if (is_cmd_type(cmds)) - nb++; - while (cmds && (is_output_type(cmds) || is_input_type(cmds) - || is_cmd_type(cmds))) - cmds = cmds->next; - if (cmds && cmds->cmd_type == PIPE) - cmds = cmds->next; - } - return (nb); -} - -int is_parenthesis(t_cmd *cmd) -{ - if (!cmd) - return (0); - return (cmd->cmd_type == PAREN || (cmd->cmd_type == PIPE - && cmd->next->cmd_type == PAREN)); -} - -void print_signaled(int status) -{ - int signal; - static const char *sigmsg[] = {0, "Hangup", 0, "Quit", "Illegal \ - instruction", "Trace/breakpoint trap", "Aborted", "Bus error", - "Floating point exception", "Killed", "User defined signal 1", - "Segmentation fault (skill issue)", "User defined signal 2", 0, - "Alarm clock", "Terminated", "Stack fault", 0, 0, "Stopped", "Stopped", - "Stopped", "Stopped", 0, "CPU time limit exceeded", - "File size limit exceeded", "Virtual time expired", - "Profiling timer expired", "I/O possible", "Power failure", - "Bad system call"}; - - signal = WTERMSIG(status); - if (signal < 31 && sigmsg[signal]) - { - ft_putstr_fd((char *)sigmsg[signal], 2); - } - if (signal >= 34 && signal <= 64) - { - ft_putstr_fd("Real-time signal ", 2); - ft_putnbr_fd(signal - 34, 2); - } - if (WCOREDUMP(status)) - ft_putstr_fd(" (core dumped)", 2); - ft_putstr_fd("\n", 2); - g_return_code = signal + 128; -} - void end_execution(t_msh *msh, int cmd_count) { int i; diff --git a/srcs/exec_utils.c b/srcs/exec_utils.c new file mode 100644 index 0000000..7848730 --- /dev/null +++ b/srcs/exec_utils.c @@ -0,0 +1,102 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* exec_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: marde-vr +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/24 10:46:28 by marde-vr #+# #+# */ +/* Updated: 2024/04/24 10:49:02 by marde-vr ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void get_redirections(t_msh *msh, t_cmd *cmds) +{ + msh->in_type = 0; + msh->out_type = 0; + if (first_is_in_type(cmds)) + { + if (!get_in_type(msh, cmds)) + get_out_type(msh, cmds); + } + else + { + if (!get_out_type(msh, cmds)) + get_in_type(msh, cmds); + } +} + +t_cmd *get_next_command(t_cmd *cmd) +{ + while (cmd) + { + while (cmd && !is_operand_type(cmd)) + cmd = cmd->next; + if (cmd && cmd->cmd_type == AND && !g_return_code) + return (cmd->next); + if (cmd && cmd->cmd_type == OR && g_return_code) + return (cmd->next); + if (cmd) + cmd = cmd->next; + } + return (0); +} + +int get_cmd_count(t_cmd *cmds) +{ + int nb; + + nb = 0; + while (cmds && !is_operand_type(cmds)) + { + while (cmds && (is_output_type(cmds) || is_input_type(cmds))) + cmds = cmds->next; + if (is_cmd_type(cmds)) + nb++; + while (cmds && (is_output_type(cmds) || is_input_type(cmds) + || is_cmd_type(cmds))) + cmds = cmds->next; + if (cmds && cmds->cmd_type == PIPE) + cmds = cmds->next; + } + return (nb); +} + +int is_parenthesis(t_cmd *cmd) +{ + if (!cmd) + return (0); + return (cmd->cmd_type == PAREN || (cmd->cmd_type == PIPE + && cmd->next->cmd_type == PAREN)); +} + +void print_signaled(int status) +{ + int signal; + static const char *sigmsg[] = {0, "Hangup", 0, "Quit", "Illegal \ + instruction", "Trace/breakpoint trap", "Aborted", "Bus error", + "Floating point exception", "Killed", "User defined signal 1", + "Segmentation fault (skill issue)", "User defined signal 2", 0, + "Alarm clock", "Terminated", "Stack fault", 0, 0, "Stopped", "Stopped", + "Stopped", "Stopped", 0, "CPU time limit exceeded", + "File size limit exceeded", "Virtual time expired", + "Profiling timer expired", "I/O possible", "Power failure", + "Bad system call"}; + + signal = WTERMSIG(status); + if (signal < 31 && sigmsg[signal]) + { + ft_putstr_fd((char *)sigmsg[signal], 2); + } + if (signal >= 34 && signal <= 64) + { + ft_putstr_fd("Real-time signal ", 2); + ft_putnbr_fd(signal - 34, 2); + } + if (WCOREDUMP(status)) + ft_putstr_fd(" (core dumped)", 2); + ft_putstr_fd("\n", 2); + g_return_code = signal + 128; +} diff --git a/srcs/export.c b/srcs/export.c index 796e982..89e11cc 100755 --- a/srcs/export.c +++ b/srcs/export.c @@ -6,75 +6,12 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/18 18:29:20 by marde-vr #+# #+# */ -/* Updated: 2024/04/24 10:42:54 by marde-vr ### ########.fr */ +/* Updated: 2024/04/24 10:59:52 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_env *dup_env(t_env *env) -{ - t_env *res; - - res = 0; - while (env) - { - res = env_add_back(res, env->name, env->value); - env = env->next; - } - return (res); -} - -void sort_env(t_env *env) -{ - t_env *tmp; - t_env *start; - char *tmp_str; - - tmp = env; - start = env; - while (tmp) - { - env = start; - while (env) - { - if (ft_strcmp(tmp->name, env->name) < 0) - { - tmp_str = tmp->name; - tmp->name = env->name; - env->name = tmp_str; - tmp_str = tmp->value; - tmp->value = env->value; - env->value = tmp_str; - } - env = env->next; - } - tmp = tmp->next; - } -} - -void print_env_declare(t_msh *msh, t_env *env_orig) -{ - t_env *env; - - env = dup_env(env_orig); - sort_env(env); - if (!msh->out_fd) - msh->out_fd = 1; - while (env) - { - if (strcmp(env->name, "_")) - { - if (env->value && *(env->value)) - ft_printf_fd(msh->out_fd, "declare -x %s=\"%s\"\n", env->name, - env->value); - else - ft_printf_fd(msh->out_fd, "declare -x %s\n", env->name); - } - env = env->next; - } -} - int export_invalid_identifier(char *arg, char *name) { ft_putstr_fd("minishell: export: `", 2); @@ -146,31 +83,6 @@ int ft_export(t_msh *msh, t_token *cmd, t_env *env) return (0); } -void delete_from_env(t_msh *msh, char *name) -{ - t_env *tmp_env; - t_env *prev; - - tmp_env = msh->env; - prev = 0; - while (tmp_env) - { - if (!strcmp(name, tmp_env->name)) - { - free(tmp_env->name); - free(tmp_env->value); - if (!prev) - msh->env = tmp_env->next; - else - prev->next = tmp_env->next; - free(tmp_env); - return ; - } - prev = tmp_env; - tmp_env = tmp_env->next; - } -} - int ft_unset(t_msh *msh) { t_token *cmd; diff --git a/srcs/free.c b/srcs/free.c new file mode 100644 index 0000000..32ba348 --- /dev/null +++ b/srcs/free.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: marde-vr +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/24 10:51:13 by marde-vr #+# #+# */ +/* Updated: 2024/04/24 10:51:25 by marde-vr ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void free_fds(t_msh *msh) +{ + int i; + + if (msh->fds) + { + i = 0; + while (msh->fds[i]) + { + free(msh->fds[i]); + msh->fds[i] = 0; + i++; + } + free(msh->fds); + msh->fds = 0; + } +} + +void free_msh(t_msh *msh) +{ + if (msh) + { + free_env(msh->env); + free(msh->pids); + free_cmd(msh->cmds_head); + free_fds(msh); + free(msh->here_doc_filename); + free_token(msh->tokens); + free(msh); + } +} diff --git a/srcs/minishell.h b/srcs/minishell.h index beebf6f..61a8e1d 100755 --- a/srcs/minishell.h +++ b/srcs/minishell.h @@ -6,7 +6,7 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/04 17:31:38 by tomoron #+# #+# */ -/* Updated: 2024/04/24 10:41:34 by marde-vr ### ########.fr */ +/* Updated: 2024/04/24 10:59:46 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ @@ -107,6 +107,11 @@ void signal_handler_here_doc(int signum); t_token *parsing_syntax_error(t_token *res); int file_access(t_msh *msh, int *found); void remove_command_from_msh(t_msh *msh); +void get_redirections(t_msh *msh, t_cmd *cmds); +t_cmd *get_next_command(t_cmd *cmd); +int get_cmd_count(t_cmd *cmds); +int is_parenthesis(t_cmd *cmd); +void print_signaled(int status); void ft_exit(t_msh *msh, int error_code); void sort_wildcards_token(t_token *list); void redirect_input(t_msh *msh, int i, char **cmd_args); @@ -133,6 +138,10 @@ int get_cmd_count(t_cmd *cmds); int check_var_name(char *name); char **get_cmd_args(t_msh *msh); char *remove_path(char *token); +t_env *dup_env(t_env *env); +void sort_env(t_env *env); +void print_env_declare(t_msh *msh, t_env *env_orig); +void delete_from_env(t_msh *msh, char *name); t_cmd *parsing_bonus(char *cmd); t_token *free_token(t_token *cmd); void exec_commands(t_msh *msh); diff --git a/srcs/output_redirections.c b/srcs/output_redirections.c index d8d7995..41e0a17 100755 --- a/srcs/output_redirections.c +++ b/srcs/output_redirections.c @@ -6,7 +6,7 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/19 14:09:44 by tomoron #+# #+# */ -/* Updated: 2024/04/22 19:42:05 by marde-vr ### ########.fr */ +/* Updated: 2024/04/24 11:04:42 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,7 +38,7 @@ int open_out_file(t_msh *msh, t_cmd **cur_cmd, char *filename) if (msh->out_type == RED_O) msh->out_fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0644); if (msh->out_type == RED_O_APP) - msh->out_fd = open(filename, O_CREAT | O_RDWR | O_APPEND, 0644); + msh->out_fd = open(filename, O_CREAT | O_WRONLY | O_APPEND, 0644); if (msh->out_fd == -1) { ft_putstr_fd("minishell: ", 2); diff --git a/srcs/utils.c b/srcs/utils.c index 3577c66..d7b860b 100755 --- a/srcs/utils.c +++ b/srcs/utils.c @@ -6,44 +6,12 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/05 18:19:26 by marde-vr #+# #+# */ -/* Updated: 2024/04/23 16:58:07 by tomoron ### ########.fr */ +/* Updated: 2024/04/24 10:51:28 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void free_fds(t_msh *msh) -{ - int i; - - if (msh->fds) - { - i = 0; - while (msh->fds[i]) - { - free(msh->fds[i]); - msh->fds[i] = 0; - i++; - } - free(msh->fds); - msh->fds = 0; - } -} - -void free_msh(t_msh *msh) -{ - if (msh) - { - free_env(msh->env); - free(msh->pids); - free_cmd(msh->cmds_head); - free_fds(msh); - free(msh->here_doc_filename); - free_token(msh->tokens); - free(msh); - } -} - void ft_exit(t_msh *msh, int exit_code) { set_echoctl(msh->echoctl); diff --git a/todo_list b/todo_list index ae82754..cede2c6 100644 --- a/todo_list +++ b/todo_list @@ -14,15 +14,18 @@ echo $? echo - "" " " hello +NORME :c + +test signals +test and verify all malocs +verify forbidden functions + + Not mandatory ig? # Empty export isn't set on `env` but is set on `export` export hello env | grep hello export | grep hello -test signals -test and verify all malocs - - -parse eof sans parse les variables potential ft_exit that doesnt unlink tmp here_doc files +parse eof sans parse les variables