From 0fb72c0c2c3a0be356a3bf27ee17b2c059717d5a Mon Sep 17 00:00:00 2001 From: mdev9 Date: Tue, 26 Mar 2024 09:12:32 +0100 Subject: [PATCH] fixed echo bt and did some norming --- srcs/commands.c | 7 +- srcs/echo.c | 20 +++- srcs/{env_to_char_tab.c => env_utils.c} | 25 ++++- srcs/exec.c | 5 +- srcs/exit.c | 23 +++-- srcs/here_doc.c | 124 ++++++------------------ srcs/here_doc_utils.c | 80 +++++++++++++++ srcs/main.c | 51 +++++----- srcs/minishell.h | 5 +- srcs/path.c | 23 +---- srcs/pipe.c | 5 +- srcs/signal_handler.c | 14 +-- 12 files changed, 211 insertions(+), 171 deletions(-) rename srcs/{env_to_char_tab.c => env_utils.c} (70%) create mode 100644 srcs/here_doc_utils.c diff --git a/srcs/commands.c b/srcs/commands.c index 1be9a4f..8e5a1a8 100644 --- a/srcs/commands.c +++ b/srcs/commands.c @@ -6,7 +6,7 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/05 18:22:15 by marde-vr #+# #+# */ -/* Updated: 2024/03/23 19:22:20 by marde-vr ### ########.fr */ +/* Updated: 2024/03/26 09:10:12 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ @@ -65,8 +65,8 @@ char **get_cmd_args(t_msh *msh) if (!cmd_args || !msh->fds) ft_exit(msh, 1); cur_cmd = msh->cmds; - i = 0; - while (i < args_count) + i = -1; + while (++i < args_count) { if (cur_cmd->type == ARG) { @@ -74,7 +74,6 @@ char **get_cmd_args(t_msh *msh) cmd_args[i] = remove_path(cur_cmd->token); else cmd_args[i] = cur_cmd->token; - i++; } else cur_cmd = cur_cmd->next; diff --git a/srcs/echo.c b/srcs/echo.c index 5999539..29b0062 100755 --- a/srcs/echo.c +++ b/srcs/echo.c @@ -6,7 +6,7 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/07 15:30:37 by tomoron #+# #+# */ -/* Updated: 2024/03/05 19:00:53 by marde-vr ### ########.fr */ +/* Updated: 2024/03/26 08:43:16 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ @@ -36,15 +36,27 @@ void put_args(t_cmd *args) int echo(t_cmd *args) { int put_nl; + int i; put_nl = 1; - while (args && args->token && !strcmp(args->token, "-n")) + i = 1; + while (args && args->token && args->token[0] == '-') { - put_nl = 0; + while (args->token[i] == 'n') + i++; + if (!args->token[i]) + put_nl = 0; + if (put_nl) + put_args(args); args = args->next; } - put_args(args); + if (!put_nl) + put_args(args); if (put_nl) + { + if (!(args->token[0] == '-')) + put_args(args); ft_putchar_fd('\n', STDOUT_FILENO); + } return (0); } diff --git a/srcs/env_to_char_tab.c b/srcs/env_utils.c similarity index 70% rename from srcs/env_to_char_tab.c rename to srcs/env_utils.c index 5d043d6..8301200 100644 --- a/srcs/env_to_char_tab.c +++ b/srcs/env_utils.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* env_to_char_tab.c :+: :+: :+: */ +/* env_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/16 13:30:18 by tomoron #+# #+# */ -/* Updated: 2024/02/16 15:08:53 by marde-vr ### ########.fr */ +/* Updated: 2024/03/26 08:49:12 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,3 +43,24 @@ char **env_to_char_tab(t_env *env) } return (res); } + +char **split_paths_from_env(t_env *env) +{ + t_env *cur_env_var; + int path_in_envp; + + path_in_envp = 0; + cur_env_var = env; + while (cur_env_var && cur_env_var->next != 0) + { + if (!ft_strcmp(cur_env_var->name, "PATH")) + { + path_in_envp = 1; + break ; + } + cur_env_var = cur_env_var->next; + } + if (!path_in_envp) + return (0); + return (ft_split(cur_env_var->value, ':')); +} diff --git a/srcs/exec.c b/srcs/exec.c index 78ec63a..18b9d8e 100755 --- a/srcs/exec.c +++ b/srcs/exec.c @@ -6,7 +6,7 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/07 14:12:49 by tomoron #+# #+# */ -/* Updated: 2024/03/25 19:01:25 by tomoron ### ########.fr */ +/* Updated: 2024/03/26 09:11:52 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ @@ -62,7 +62,6 @@ void exec_command(t_msh *msh, int i, int cmd_count) } if (!cmd_is_builtin(msh, msh->cmds->token)) get_cmd_path(msh); - //if(!g_return_code) exec(msh, get_cmd_args(msh), i, cmd_count); remove_command_from_msh(msh); } @@ -89,7 +88,7 @@ void exec_commands(t_msh *msh) waitpid(msh->pids[i], &status, 0); i++; } - if(!g_return_code && WIFEXITED(status)) + if (!g_return_code && WIFEXITED(status)) g_return_code = WEXITSTATUS(status); i = 0; while (i < cmd_count) diff --git a/srcs/exit.c b/srcs/exit.c index 1ccca80..59517f1 100755 --- a/srcs/exit.c +++ b/srcs/exit.c @@ -6,7 +6,7 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/07 16:04:11 by tomoron #+# #+# */ -/* Updated: 2024/03/23 19:20:54 by marde-vr ### ########.fr */ +/* Updated: 2024/03/26 08:59:44 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,20 @@ void numeric_arg_err(char *arg, int *exit_code) *exit_code = 2; } +void get_exit_bt_return_code(t_msh *msh) +{ + t_cmd *cur_cmd; + int exit_code; + + cur_cmd = msh->cmds->next; + if (cur_cmd && cur_cmd->type == ARG && !ft_strisnbr(cur_cmd->token)) + numeric_arg_err(cur_cmd->token, &exit_code); + else if (cur_cmd && cur_cmd->type == ARG) + exit_code = (unsigned char)ft_atoi(cur_cmd->token); + else + exit_code = g_return_code; +} + void exit_bt(t_msh *msh) { t_cmd *cur_cmd; @@ -36,12 +50,7 @@ void exit_bt(t_msh *msh) } else { - if (cur_cmd && cur_cmd->type == ARG && !ft_strisnbr(cur_cmd->token)) - numeric_arg_err(cur_cmd->token, &exit_code); - else if (cur_cmd && cur_cmd->type == ARG) - exit_code = (unsigned char)ft_atoi(cur_cmd->token); - else - exit_code = g_return_code; + get_exit_bt_return_code(msh); if (msh->fds) { cmd_count = get_cmd_count(msh->cmds); diff --git a/srcs/here_doc.c b/srcs/here_doc.c index cf98993..1aa1427 100644 --- a/srcs/here_doc.c +++ b/srcs/here_doc.c @@ -6,79 +6,12 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/24 17:44:32 by marde-vr #+# #+# */ -/* Updated: 2024/03/25 20:38:21 by tomoron ### ########.fr */ +/* Updated: 2024/03/26 09:07:01 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -char *get_tmp_file_name(t_msh *msh) -{ - int i; - char *tmp_file_name; - char *res; - char *i_char; - - i = 0; - tmp_file_name = ".tmp"; - i_char = ft_itoa(i); - res = ft_strjoin_free(tmp_file_name, i_char, 2); - if (!res) - ft_exit(msh, 1); - while (!access(res, F_OK)) - { - free(res); - i_char = ft_itoa(i); - res = ft_strjoin_free(tmp_file_name, i_char, 2); - if (!res) - ft_exit(msh, 1); - i++; - } - return (res); -} - -int contains_newline(char *str) -{ - int i; - - i = 0; - if (!str) - return (0); - while (str[i]) - { - if (str[i] == '\n') - return (1); - i++; - } - return (0); -} - -void parse_var(t_msh *msh, char *line) -{ - char *var_name; - - while(*line) - { - if(*line == '$') - { - var_name = get_var_name(line + 1); - if(!var_name) - return; - line += ft_strlen(var_name); - if(!*var_name) - write(msh->in_fd, "$", 1); - else if(!ft_strcmp(var_name, "?")) - ft_putnbr_fd(g_return_code, msh->in_fd); - else - ft_putstr_fd(ft_get_env(msh->env, var_name), msh->in_fd); - free(var_name); - } - else - write(msh->in_fd, line, 1); - line++; - } -} - void get_here_doc_input(t_msh *msh, char *eof) { char *line; @@ -103,11 +36,39 @@ void get_here_doc_input(t_msh *msh, char *eof) free(line); } +void here_doc_child(t_msh *msh, char *eof, char *here_doc_file) +{ + here_doc_variables(1, 0, msh); + here_doc_variables(1, 1, here_doc_file); + get_here_doc_input(msh, eof); + close(msh->in_fd); + free(here_doc_file); + free(msh->fds[0]); + ft_exit(msh, 0); +} + +void here_doc_signal(t_msh *msh, int child_pid, char *here_doc_file) +{ + int status; + + signal(SIGINT, signal_handler_command); + signal(SIGQUIT, signal_handler_here_doc); + waitpid(child_pid, &status, 0); + signal(SIGINT, signal_handler_interactive); + signal(SIGQUIT, signal_handler_interactive); + close(msh->in_fd); + if (WIFEXITED(status) && WEXITSTATUS(status)) + unlink(here_doc_file); + msh->in_fd = open(here_doc_file, O_RDWR, 0644); + free(here_doc_file); + if (msh->in_fd == -1 && !(WIFEXITED(status) && WEXITSTATUS(status))) + perror("open"); +} + void handle_here_doc(t_msh *msh, char *eof) { char *here_doc_file; int pid; - int status; here_doc_file = get_tmp_file_name(msh); msh->in_fd = open(here_doc_file, O_CREAT | O_RDWR, 0644); @@ -118,28 +79,7 @@ void handle_here_doc(t_msh *msh, char *eof) } pid = fork(); if (pid == 0) - { - here_doc_variables(1, 0, msh); - here_doc_variables(1, 1, here_doc_file); - get_here_doc_input(msh, eof); - close(msh->in_fd); - free(here_doc_file); - free(msh->fds[0]); - ft_exit(msh, 0); - } + here_doc_child(msh, eof, here_doc_file); else - { - signal(SIGINT, signal_handler_command); - signal(SIGQUIT, signal_handler_here_doc); - waitpid(pid, &status , 0); - signal(SIGINT, signal_handler_interactive); - signal(SIGQUIT, signal_handler_interactive); - close(msh->in_fd); - if(WIFEXITED(status) && WEXITSTATUS(status)) - unlink(here_doc_file); - msh->in_fd = open(here_doc_file, O_RDWR, 0644); - free(here_doc_file); - if (msh->in_fd == -1 && !(WIFEXITED(status) && WEXITSTATUS(status))) - perror("open"); - } + here_doc_signal(msh, pid, here_doc_file); } diff --git a/srcs/here_doc_utils.c b/srcs/here_doc_utils.c new file mode 100644 index 0000000..bd4ba01 --- /dev/null +++ b/srcs/here_doc_utils.c @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* here_doc_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: marde-vr +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/03/26 09:06:51 by marde-vr #+# #+# */ +/* Updated: 2024/03/26 09:07:42 by marde-vr ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *get_tmp_file_name(t_msh *msh) +{ + int i; + char *tmp_file_name; + char *res; + char *i_char; + + i = 0; + tmp_file_name = ".tmp"; + i_char = ft_itoa(i); + res = ft_strjoin_free(tmp_file_name, i_char, 2); + if (!res) + ft_exit(msh, 1); + while (!access(res, F_OK)) + { + free(res); + i_char = ft_itoa(i); + res = ft_strjoin_free(tmp_file_name, i_char, 2); + if (!res) + ft_exit(msh, 1); + i++; + } + return (res); +} + +int contains_newline(char *str) +{ + int i; + + i = 0; + if (!str) + return (0); + while (str[i]) + { + if (str[i] == '\n') + return (1); + i++; + } + return (0); +} + +void parse_var(t_msh *msh, char *line) +{ + char *var_name; + + while (*line) + { + if (*line == '$') + { + var_name = get_var_name(line + 1); + if (!var_name) + return ; + line += ft_strlen(var_name); + if (!*var_name) + write(msh->in_fd, "$", 1); + else if (!ft_strcmp(var_name, "?")) + ft_putnbr_fd(g_return_code, msh->in_fd); + else + ft_putstr_fd(ft_get_env(msh->env, var_name), msh->in_fd); + free(var_name); + } + else + write(msh->in_fd, line, 1); + line++; + } +} diff --git a/srcs/main.c b/srcs/main.c index dac550f..4a220cf 100755 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,13 +6,13 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/02 21:59:20 by tomoron #+# #+# */ -/* Updated: 2024/03/25 20:04:03 by tomoron ### ########.fr */ +/* Updated: 2024/03/26 08:44:14 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -int g_return_code = 0; +int g_return_code = 0; char *get_prompt(t_env *env) { @@ -22,7 +22,7 @@ char *get_prompt(t_env *env) res = ft_strjoin_free("\001", ft_get_color(10, 255, 80), 2); res = ft_strjoin_free(res, "\033[1m\002", 1); - if(getenv("USER")) + if (getenv("USER")) { res = ft_strjoin_free(res, getenv("USER"), 1); res = ft_strjoin_free(res, "@", 1); @@ -73,28 +73,33 @@ t_env *get_env(char **envp) void print_binary(unsigned int num) { - if (num == 0) { - printf("0"); - return; - } - - // Taille d'un unsigned int en bits - int size = sizeof(unsigned int) * 8; - int i; - - // Parcours de chaque bit de droite à gauche - for (i = size - 1; i >= 0; i--) { - // Vérifie si le bit est 1 ou 0 - if (num & (1u << i)) - printf("1"); - else - printf("0"); - } + int size; + int i; + + if (num == 0) + { + printf("0"); + return ; + } + + //Tom qu'est-ce que t'a fait ????? + + // Taille d'un unsigned int en bits + size = sizeof(unsigned int) * 8; + // Parcours de chaque bit de droite à gauche + for (i = size - 1; i >= 0; i--) + { + // Vérifie si le bit est 1 ou 0 + if (num & (1u << i)) + printf("1"); + else + printf("0"); + } } int init_minishell(t_msh **msh, int argc, char **argv, char **envp) { - struct termios t_p; + struct termios t_p; *msh = ft_calloc(1, sizeof(t_msh)); if (!*msh) @@ -104,11 +109,7 @@ int init_minishell(t_msh **msh, int argc, char **argv, char **envp) (*msh)->env = get_env(envp); signal(SIGINT, signal_handler_interactive); signal(SIGQUIT, signal_handler_interactive); - if(tcgetattr(1, &t_p)) - ft_printf_fd(2, "an error occured while setting the flags"); t_p.c_lflag = t_p.c_lflag & (~ECHOCTL); - if(tcsetattr(1, TCSANOW, &t_p)) - ft_printf_fd(2, "an error occured while setting the flags"); return (0); } diff --git a/srcs/minishell.h b/srcs/minishell.h index f8005c0..3dbc39b 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/03/25 19:37:11 by tomoron ### ########.fr */ +/* Updated: 2024/03/26 09:07:38 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ @@ -113,5 +113,8 @@ void signal_handler_command(int signum); void signal_handler_here_doc(int signum); char *get_var_name(char *str); void *here_doc_variables(int write, int index, void *data); +char *get_tmp_file_name(t_msh *msh); +int contains_newline(char *str); +void parse_var(t_msh *msh, char *line); #endif diff --git a/srcs/path.c b/srcs/path.c index 4c1e4aa..5f62c81 100644 --- a/srcs/path.c +++ b/srcs/path.c @@ -6,34 +6,13 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/02/21 21:47:15 by marde-vr #+# #+# */ -/* Updated: 2024/03/25 13:26:18 by tomoron ### ########.fr */ +/* Updated: 2024/03/26 08:49:24 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" #include -char **split_paths_from_env(t_env *env) -{ - t_env *cur_env_var; - int path_in_envp; - - path_in_envp = 0; - cur_env_var = env; - while (cur_env_var && cur_env_var->next != 0) - { - if (!ft_strcmp(cur_env_var->name, "PATH")) - { - path_in_envp = 1; - break ; - } - cur_env_var = cur_env_var->next; - } - if (!path_in_envp) - return (0); - return (ft_split(cur_env_var->value, ':')); -} - void find_cmd_path(t_msh *msh, char **paths, int *found) { char *tmp; diff --git a/srcs/pipe.c b/srcs/pipe.c index 0c1ff73..e5a7867 100644 --- a/srcs/pipe.c +++ b/srcs/pipe.c @@ -6,7 +6,7 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/05 18:17:25 by marde-vr #+# #+# */ -/* Updated: 2024/03/25 13:48:42 by marde-vr ### ########.fr */ +/* Updated: 2024/03/26 08:40:54 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,8 +41,6 @@ void execute_command(t_msh *msh, char **cmd_args, int i) i--; } free(cmd_args); - //ft_exit(msh, 1); - //ft_printf_fd(2, "exiting with code: %d\n", g_return_code); ft_exit(msh, g_return_code); } if (msh->cmds->token) @@ -62,7 +60,6 @@ void child(t_msh *msh, char **cmd_args, int i) || msh->out_type == RED_O_APP) redirect_output(msh, i); close_pipe_fds(msh, i); - //if (!g_return_code) execute_command(msh, cmd_args, i); close(0); close(1); diff --git a/srcs/signal_handler.c b/srcs/signal_handler.c index 6c9591f..111caf1 100644 --- a/srcs/signal_handler.c +++ b/srcs/signal_handler.c @@ -6,7 +6,7 @@ /* By: marde-vr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/22 14:31:13 by tomoron #+# #+# */ -/* Updated: 2024/03/25 20:39:21 by tomoron ### ########.fr */ +/* Updated: 2024/03/26 08:42:47 by marde-vr ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ void signal_handler_interactive(int signum) if (signum == SIGINT) { g_return_code = 130; - printf("%s%s^C\n",rl_prompt, rl_line_buffer); + printf("%s%s^C\n", rl_prompt, rl_line_buffer); rl_replace_line("", 0); rl_on_new_line(); rl_redisplay(); @@ -28,13 +28,13 @@ void signal_handler_interactive(int signum) void *here_doc_variables(int write, int index, void *data) { - static void *variables[2]; + static void *variables[2]; if (write) variables[index] = data; else return (variables[index]); - return(0); + return (0); } void signal_handler_here_doc(int signum) @@ -42,9 +42,9 @@ void signal_handler_here_doc(int signum) t_msh *msh; char *here_doc_file; - if(signum == SIGINT) + if (signum == SIGINT) { - printf("%s%s^C\n",rl_prompt, rl_line_buffer); + printf("%s%s^C\n", rl_prompt, rl_line_buffer); msh = here_doc_variables(0, 0, 0); here_doc_file = here_doc_variables(0, 1, 0); close(msh->in_fd); @@ -56,6 +56,6 @@ void signal_handler_here_doc(int signum) void signal_handler_command(int signum) { - if(signum == SIGQUIT) + if (signum == SIGQUIT) printf("^\\Quit (core dumped)\n"); }