Skip to content

Commit

Permalink
adding global mini varible for freeing! still doesnt work but getting…
Browse files Browse the repository at this point in the history
… better
  • Loading branch information
Jack Skehan committed Aug 2, 2024
1 parent 4a2833c commit 572e8a2
Show file tree
Hide file tree
Showing 6 changed files with 124 additions and 100 deletions.
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
# ::: :::::::: #
# Makefile :+: :+: :+: #
# +:+ +:+ +:+ #
# By: iverniho <iverniho@student.42.fr> +#+ +:+ +#+ #
# By: Jskehan <jskehan@student.42Berlin.de> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2024/05/14 15:15:48 by iverniho #+# #+# #
# Updated: 2024/07/28 16:08:25 by iverniho ### ########.fr #
# Updated: 2024/08/02 16:19:19 by Jskehan ### ########.fr #
# #
# **************************************************************************** #

NAME = minishell

CC = cc
CFLAGS = -Wall -Wextra -Werror # -fsanitize=address -g
CFLAGS = -Wall -Wextra -Werror -fsanitize=address -g

LIBFT = ./lib/libft/

Expand Down
25 changes: 18 additions & 7 deletions includes/minishell.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
/* ::: :::::::: */
/* minishell.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: iverniho <iverniho@student.42.fr> +#+ +:+ +#+ */
/* By: Jskehan <jskehan@student.42Berlin.de> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/14 15:11:41 by iverniho #+# #+# */
/* Updated: 2024/07/28 16:25:18 by iverniho ### ########.fr */
/* Updated: 2024/08/02 16:18:20 by Jskehan ### ########.fr */
/* */
/* ************************************************************************** */

Expand Down Expand Up @@ -63,13 +63,22 @@ extern volatile sig_atomic_t g_is_executing_command;
/* */
/* ************************************************************************** */

typedef struct s_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_mini;
char **envp;
t_list *node;
char *current_dir;
int exit_status;
t_signals signals;
} t_mini;

extern t_mini *g_mini;

typedef struct s_cmd
{
Expand All @@ -91,6 +100,8 @@ typedef struct s_cmd

/* Initialization and Setup */
t_cmd *init_cmd(t_mini *mini);
void init_mini(t_mini *mini);
void free_mini(t_mini *mini);
void setup_signal_handlers(void);
void setup_child_signals(void);
void handle_sigint(int sig);
Expand Down
14 changes: 11 additions & 3 deletions src/init/initilisation.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
/* ::: :::::::: */
/* initilisation.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: Jskehan <jskehan@student.42berlin.de> +#+ +:+ +#+ */
/* By: Jskehan <jskehan@student.42Berlin.de> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/07/25 15:18:28 by Jskehan #+# #+# */
/* Updated: 2024/07/25 16:03:26 by Jskehan ### ########.fr */
/* Updated: 2024/08/02 16:17:28 by Jskehan ### ########.fr */
/* */
/* ************************************************************************** */

Expand Down Expand Up @@ -74,4 +74,12 @@ t_cmd *init_cmd(t_mini *mini)
node->is_append = 0;
node->mini = mini;
return (node);
}
}
void init_mini(t_mini *mini)
{
mini->node = NULL;
mini->current_dir = NULL;
mini->exit_status = 0;
mini->signals.sigint_received = 0;
mini->signals.is_executing_command = 0;
}
8 changes: 6 additions & 2 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,26 @@
/* ::: :::::::: */
/* main.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: Jskehan <jskehan@student.42berlin.de> +#+ +:+ +#+ */
/* By: Jskehan <jskehan@student.42Berlin.de> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/15 20:09:06 by Jskehan #+# #+# */
/* Updated: 2024/07/25 16:03:23 by Jskehan ### ########.fr */
/* Updated: 2024/08/02 16:17:12 by Jskehan ### ########.fr */
/* */
/* ************************************************************************** */

#include "minishell.h"

t_mini *g_mini = NULL;

int main(int argc, char **argv, char **envp)
{
t_mini *mini;

(void)argc;
(void)argv;
initialize_envp(&mini, envp);
init_mini(mini);
g_mini = mini;
setup_signal_handlers();
//--------------TESTING----------------
// test_exec();
Expand Down
13 changes: 7 additions & 6 deletions src/signal/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,32 @@
/* ::: :::::::: */
/* signal.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: Jskehan <jskehan@student.42berlin.de> +#+ +:+ +#+ */
/* By: Jskehan <jskehan@student.42Berlin.de> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/28 13:30:14 by Jskehan #+# #+# */
/* Updated: 2024/08/02 12:04:20 by Jskehan ### ########.fr */
/* Updated: 2024/08/02 16:18:01 by Jskehan ### ########.fr */
/* */
/* ************************************************************************** */

#include "minishell.h"

volatile sig_atomic_t g_sigint_received = 0;
volatile sig_atomic_t g_is_executing_command = 0;

static void handle_signal(int signal)
{
if (signal == SIGINT)
{
g_sigint_received = 1;
g_mini->signals.sigint_received = 1;
write(STDOUT_FILENO, "\n", 1);
rl_replace_line("", 0);
rl_on_new_line();
if (!g_is_executing_command)
if (!g_mini->signals.is_executing_command)
rl_redisplay();
}
else if (signal == SIGQUIT)
{
write(STDOUT_FILENO, "\nQuit\n", 6);
free_mini(g_mini);
}
}

void setup_signal_handlers(void)
Expand Down
158 changes: 79 additions & 79 deletions src/utils/prompt.c
Original file line number Diff line number Diff line change
@@ -1,76 +1,77 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* prompt.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: Jskehan <jskehan@student.42berlin.de> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/15 21:09:11 by Jskehan #+# #+# */
/* Updated: 2024/08/02 14:20:23 by Jskehan ### ########.fr */
/* */
/* ************************************************************************** */
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* prompt.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: Jskehan <jskehan@student.42Berlin.de> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/15 21:09:11 by Jskehan #+# #+# */
/* Updated: 2024/08/02 16:19:01 by Jskehan ### ########.fr */
/* */
/* ************************************************************************** */

#include "minishell.h"
#include "minishell.h"

void handle_command_node(char **input, t_list **commands,
t_list **cur_command, int *i, t_mini *mini)
void handle_command_node(char **input, t_list **commands,
t_list **cur_command, int *i, t_mini *mini)
{
*cur_command = ft_lstlast(*commands);
if (*i == 0 || (input[*i][0] == '|' && input[*i + 1] && input[*i + 1][0]))
{
ft_lstadd_back(commands, ft_lstnew(init_cmd(mini)));
*cur_command = ft_lstlast(*commands);
if (*i == 0 || (input[*i][0] == '|' && input[*i + 1] && input[*i + 1][0]))
{
ft_lstadd_back(commands, ft_lstnew(init_cmd(mini)));
*cur_command = ft_lstlast(*commands);
}
(*cur_command)->content = set_redir((*cur_command)->content, input[*i],
input, i);
}
(*cur_command)->content = set_redir((*cur_command)->content, input[*i],
input, i);
}

t_list *create_nodes(char **input, t_mini *mini)
{
t_list *commands;
t_list *cur_command;
int i;
t_list *create_nodes(char **input, t_mini *mini)
{
t_list *commands;
t_list *cur_command;
int i;

commands = NULL;
cur_command = NULL;
i = -1;
(void)mini;
while (input && input[++i])
commands = NULL;
cur_command = NULL;
i = -1;
(void)mini;
while (input && input[++i])
{
handle_command_node(input, &commands, &cur_command, &i, mini);
if (i == -2)
{
handle_command_node(input, &commands, &cur_command, &i, mini);
if (i == -2)
{
ft_lstclear(&commands, free);
ft_free_2d_array(&input);
return (NULL);
}
ft_lstclear(&commands, free);
ft_free_2d_array(&input);
return (NULL);
}
return (commands);
}
return (commands);
}

int check_tokenized_input(char **tokenized_input)
{
int i;
int j;
int check_tokenized_input(char **tokenized_input)
{
int i;
int j;

i = -1;
j = 0;
while (tokenized_input && tokenized_input[++i])
{
if (j == 1 && ft_is_special_in_str(tokenized_input[i]) == 1)
return (ft_error(6, tokenized_input[i]), 0);
j = ft_is_special_in_str(tokenized_input[i]);
}
return (1);
i = -1;
j = 0;
while (tokenized_input && tokenized_input[++i])
{
if (j == 1 && ft_is_special_in_str(tokenized_input[i]) == 1)
return (ft_error(6, tokenized_input[i]), 0);
j = ft_is_special_in_str(tokenized_input[i]);
}
return (1);
}

void handle_input(char *input, t_mini *mini)
{
char **tokenized_input;
t_list *commands;

tokenized_input = ft_remove_quotes(tokenize_input(input, &mini));
if (!tokenized_input || !tokenized_input[0] || !check_tokenized_input(tokenized_input))
if (!tokenized_input || !tokenized_input[0]
|| !check_tokenized_input(tokenized_input))
{
free(input);
if (tokenized_input)
Expand All @@ -84,34 +85,33 @@ void handle_input(char *input, t_mini *mini)
free(input);
}

void prompt_loop(t_mini *mini)
{
char *input;

void prompt_loop(t_mini *mini)
setup_signal_handlers();
while (1)
{
char *input;

setup_signal_handlers();
while (1)
if (mini->signals.sigint_received)
{
if (g_sigint_received)
{
g_sigint_received = 0;
continue ; // Ensure readline gets called again
}
input = readline(PROMPT);
if (input == NULL)
{
printf("\n");
break ;
}
if (input[0] != '\0')
add_history(input);
else
{
free(input);
continue ;
}
g_is_executing_command = 1;
handle_input(input, mini);
g_is_executing_command = 0;
mini->signals.sigint_received = 0;
continue ; // Ensure readline gets called again
}
input = readline(PROMPT);
if (input == NULL)
{
printf("\n");
break ;
}
if (input[0] != '\0')
add_history(input);
else
{
free(input);
continue ;
}
mini->signals.is_executing_command = 1;
handle_input(input, mini);
mini->signals.is_executing_command = 0;
}
}

0 comments on commit 572e8a2

Please sign in to comment.