fixed echo bt and did some norming

This commit is contained in:
mdev9
2024-03-26 09:12:32 +01:00
parent c5b6f8f53e
commit 0fb72c0c2c
12 changed files with 211 additions and 171 deletions

View File

@ -6,7 +6,7 @@
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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;

View File

@ -6,7 +6,7 @@
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}

View File

@ -1,12 +1,12 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* env_to_char_tab.c :+: :+: :+: */
/* env_utils.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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, ':'));
}

View File

@ -6,7 +6,7 @@
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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)

View File

@ -6,7 +6,7 @@
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);

View File

@ -6,79 +6,12 @@
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}

80
srcs/here_doc_utils.c Normal file
View File

@ -0,0 +1,80 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* here_doc_utils.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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++;
}
}

View File

@ -6,13 +6,13 @@
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}

View File

@ -6,7 +6,7 @@
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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

View File

@ -6,34 +6,13 @@
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <unistd.h>
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;

View File

@ -6,7 +6,7 @@
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);

View File

@ -6,7 +6,7 @@
/* By: marde-vr <marde-vr@42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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");
}