From 0e2ec315b90454ba93dbe86703054bd2e4596129 Mon Sep 17 00:00:00 2001 From: Maieul BOYER Date: Thu, 2 May 2024 14:22:28 +0200 Subject: [PATCH] crude signal handling --- includes/app/signal_handler.h | 24 +++++++++++++ includes/gmr | 1 + sources/ft_exit.c | 3 +- sources/main.c | 35 +++++++++++-------- sources/signal_handler.c | 66 +++++++++++++++++++++++++++++++++++ src.list | 1 + 6 files changed, 114 insertions(+), 16 deletions(-) create mode 100644 includes/app/signal_handler.h create mode 120000 includes/gmr create mode 100644 sources/signal_handler.c diff --git a/includes/app/signal_handler.h b/includes/app/signal_handler.h new file mode 100644 index 00000000..b5012ed3 --- /dev/null +++ b/includes/app/signal_handler.h @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* signal_handler.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maiboyer +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/02 13:20:25 by maiboyer #+# #+# */ +/* Updated: 2024/05/02 13:23:06 by maiboyer ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef SIGNAL_HANDLER_H +#define SIGNAL_HANDLER_H + +#include "me/types.h" +#include +#include + +typedef t_i32 t_signal; + +t_error install_signal(void); + +#endif /* SIGNAL_HANDLER_H */ diff --git a/includes/gmr b/includes/gmr new file mode 120000 index 00000000..7a0b1420 --- /dev/null +++ b/includes/gmr @@ -0,0 +1 @@ +../parser/static/headers/ \ No newline at end of file diff --git a/sources/ft_exit.c b/sources/ft_exit.c index cc5f8b35..89fb7da1 100644 --- a/sources/ft_exit.c +++ b/sources/ft_exit.c @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/29 11:35:51 by rparodi #+# #+# */ -/* Updated: 2024/04/30 22:03:14 by maiboyer ### ########.fr */ +/* Updated: 2024/05/02 13:46:39 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,6 +48,5 @@ void ft_exit(t_utils *maiboyerlpb, t_u8 exit_status) { if (maiboyerlpb != NULL) ft_free_utils(maiboyerlpb); - printf("exit\n"); exit(exit_status); } diff --git a/sources/main.c b/sources/main.c index bd7e0eba..f2b8df4d 100644 --- a/sources/main.c +++ b/sources/main.c @@ -6,22 +6,23 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/28 14:40:38 by rparodi #+# #+# */ -/* Updated: 2024/05/01 10:36:58 by maiboyer ### ########.fr */ +/* Updated: 2024/05/02 14:18:02 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ #include "../includes/minishell.h" #include "app/node.h" +#include "app/signal_handler.h" #include "me/string/str_len.h" #include "parser/api.h" t_first_parser *ts_parser_new(); -void ts_tree_delete(t_first_tree *); -t_parse_node ts_tree_root_node(t_first_tree *); -t_first_tree *ts_parser_parse_string(t_first_parser *, t_first_tree *oldtree, t_const_str input, - t_usize len); -void ts_parser_delete(t_first_parser *self); -void ts_parser_set_language(t_first_parser *self, t_language *lang); +void ts_tree_delete(t_first_tree *); +t_parse_node ts_tree_root_node(t_first_tree *); +t_first_tree *ts_parser_parse_string(t_first_parser *, t_first_tree *oldtree, + t_const_str input, t_usize len); +void ts_parser_delete(t_first_parser *self); +void ts_parser_set_language(t_first_parser *self, t_language *lang); void print_node_data(t_node *t, t_usize depth) { @@ -31,7 +32,7 @@ void print_node_data(t_node *t, t_usize depth) while (idx++ < depth) printf("\t"); idx = 0; - printf("%s = %s\n", t->kind_str, node_getstr(t)); + printf("%s(%llu) = %s\n", t->kind_str, t->kind, node_getstr(t)); while (idx < t->childs_count) print_node_data(&t->childs[idx++], depth + 1); } @@ -39,8 +40,8 @@ void print_node_data(t_node *t, t_usize depth) t_node parse_to_nodes(t_first_parser *parser, t_const_str input) { t_first_tree *tree; - t_parse_node node; - t_node ret; + t_parse_node node; + t_node ret; tree = ts_parser_parse_string(parser, NULL, input, str_len(input)); node = ts_tree_root_node(tree); @@ -116,8 +117,8 @@ t_language *tree_sitter_bash(void); t_parser create_myparser(void) { - t_language *lang; - t_first_parser *parser; + t_language *lang; + t_first_parser *parser; lang = tree_sitter_bash(); parser = ts_parser_new(); @@ -137,9 +138,15 @@ t_i32 main(t_i32 argc, t_str argv[], t_str envp[]) (void)argc; (void)argv; (void)envp; + if (install_signal()) + return (1); utils = (t_utils){}; utils.parser = create_myparser(); - // ft_find_path(arge, &utils); - utils.name_shell = "42sh > "; + utils.name_shell = "\001\x1B[93m\002" + "42sh" + "\001\x1B[32m\002" + ">" + "\001\x1B[0m\002" + "$ "; ft_take_args(&utils); } diff --git a/sources/signal_handler.c b/sources/signal_handler.c new file mode 100644 index 00000000..f91c09bb --- /dev/null +++ b/sources/signal_handler.c @@ -0,0 +1,66 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* signal_handler.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maiboyer +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/02 13:22:14 by maiboyer #+# #+# */ +/* Updated: 2024/05/02 14:00:31 by maiboyer ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "app/signal_handler.h" +#include "me/types.h" +#include "readline/readline.h" +#include + +void sigint_handle(int sig, siginfo_t *info, void *ucontext) +{ + static int count = 0; + (void)(sig); + (void)(info); + (void)(ucontext); + count++; + printf("\n"); + rl_replace_line("", 0); + rl_on_new_line(); + rl_redisplay(); + if (count == 10) + { + exit(1); + } +} + +void sigquit_handle(int sig, siginfo_t *info, void *ucontext) +{ + static int count = 0; + (void)(sig); + (void)(info); + (void)(ucontext); + count++; + printf("\n"); + rl_replace_line("", 0); + rl_on_new_line(); + rl_redisplay(); + if (count == 10) + { + exit(1); + } +} + +t_error install_signal(void) +{ + struct sigaction data; + + data.sa_sigaction = sigint_handle; + data.sa_flags = SA_SIGINFO | SA_NOCLDWAIT; + if (sigaction(SIGINT, &data, NULL)) + return (ERROR); + + data.sa_sigaction = sigquit_handle; + if (sigaction(SIGQUIT, &data, NULL)) + return (ERROR); + + return (NO_ERROR); +} diff --git a/src.list b/src.list index 0530ac76..f0e11998 100644 --- a/src.list +++ b/src.list @@ -5,3 +5,4 @@ ft_pwd.c main.c node/create_node.c node/node.c +signal_handler.c