diff --git a/Filelist.sh.mk b/Filelist.sh.mk index ab333e8e..af82cf21 100644 --- a/Filelist.sh.mk +++ b/Filelist.sh.mk @@ -2,6 +2,7 @@ SRC_FILES = \ env \ _env_norm_helper \ ft_exit \ +_helper_main \ main \ node/node \ signal_handler \ diff --git a/sources/_env_norm_helper.c b/sources/_env_norm_helper.c index 44087780..bfb96f45 100644 --- a/sources/_env_norm_helper.c +++ b/sources/_env_norm_helper.c @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/06 15:39:47 by rparodi #+# #+# */ -/* Updated: 2024/09/06 16:24:40 by rparodi ### ########.fr */ +/* Updated: 2024/09/06 16:35:15 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ #include "me/vec/vec_str.h" #include -t_error _build_envp_iterator(t_usize idx, const t_str *key, t_str *val, +t_error _build_envp_iterator(t_usize idx, const t_str *key, t_str *val, \ void *ctx); t_error build_envp(\ diff --git a/sources/_helper_main.c b/sources/_helper_main.c new file mode 100644 index 00000000..ee7fe4e5 --- /dev/null +++ b/sources/_helper_main.c @@ -0,0 +1,94 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* _helper_main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/06 16:31:41 by rparodi #+# #+# */ +/* Updated: 2024/09/06 16:37:49 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "app/colors.h" +#include "app/env.h" +#include "app/node.h" +#include "app/signal_handler.h" +#include "app/state.h" +#include "ast/ast.h" +#include "exec/_run_ast.h" +#include "line/line.h" +#include "me/hashmap/hashmap_env.h" +#include "me/mem/mem.h" +#include "me/str/str.h" +#include "me/string/string.h" +#include "me/types.h" +#include "parser/api.h" +#include +#include + +void ft_exit(t_state *maiboyerlpb, t_u8 exit_status); +void print_node_data(t_node *t, t_usize depth); +t_node parse_str(t_state *state); +t_language *tree_sitter_sh(void); + +t_error get_user_input(t_state *state) +{ + t_line_state lstate; + + if (line_edit_start(&lstate, get_stdin(), get_stdout(), state->prompt)) + return (ERROR); + while (!line_edit_feed(&lstate, &state->str_input)) + { + if (errno == EAGAIN) + { + errno = 0; + lstate.pos = 0; + string_clear(&lstate.buf); + write_fd(lstate.output_fd, (void *)"^C\n", 3, NULL); + line_refresh_line(&lstate); + } + } + line_edit_stop(&lstate); + return (NO_ERROR); +} + +void exec_shcat(t_state *state) +{ + t_program_result prog_res; + + prog_res = (t_program_result){.exit = 0}; + print_node_data(&state->current_node, 0); + free_node(state->current_node); + if (state->ast != NULL && run_program(\ + &state->ast->data.program, state, &prog_res)) + printf("Error when execting the Command \n"); + ast_free(state->ast); +} + +void ft_take_args(t_state *state) +{ + while (true) + { + state->str_input = NULL; + if (get_user_input(state)) + ft_exit(state, 1); + if (state->str_input == NULL) + ft_exit(state, 0); + line_history_add(state->str_input); + state->current_node = parse_str(state); + exec_shcat(state); + mem_free(state->str_input); + } +} + +t_first_parser *create_myparser(void) +{ + t_language *lang; + t_first_parser *parser; + + lang = tree_sitter_sh(); + parser = ts_parser_new(); + ts_parser_set_language(parser, lang); + return (parser); +} diff --git a/sources/main.c b/sources/main.c index a58a5e67..9a1ef4fe 100644 --- a/sources/main.c +++ b/sources/main.c @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/28 14:40:38 by rparodi #+# #+# */ -/* Updated: 2024/09/06 15:46:18 by rparodi ### ########.fr */ +/* Updated: 2024/09/06 16:33:58 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,17 +27,21 @@ #include #include -t_error ast_from_node(t_parse_node node, t_str input, t_ast_node *out); -void ast_print_node(t_ast_node self); -void ft_exit(t_state *maiboyerlpb, t_u8 exit_status); +t_error ast_from_node(t_parse_node node, t_str input, t_ast_node *out); +t_error get_user_input(t_state *state); +t_first_parser *create_myparser(void); +void ast_print_node(t_ast_node self); +void ft_exit(t_state *maiboyerlpb, t_u8 exit_status); +void exec_shcat(t_state *state); +void ft_take_args(t_state *state); // Foutre envp dans env // Chaque elemenet d'envp split au premier = // cle avant le = // data apres le = -t_language *tree_sitter_sh(void); -void ast_free(t_ast_node node); +t_language *tree_sitter_sh(void); +void ast_free(t_ast_node node); t_error split_str_first(\ t_const_str s, char splitter, t_str *before, t_str *after) @@ -106,7 +110,10 @@ t_node parse_str(t_state *state) state->parser, state->str_input, str_len(state->str_input)); node = ts_tree_root_node(tree); if (ast_from_node(node, state->str_input, &out)) - (state->ast = NULL, printf("Error when building node\n")); + { + state->ast = NULL; + printf("Error when building node\n"); + } else state->ast = out; ret = build_node(node, state->str_input); @@ -114,67 +121,6 @@ t_node parse_str(t_state *state) return (ret); } -void exec_shcat(t_state *state) -{ - t_program_result prog_res; - - prog_res = (t_program_result){.exit = 0}; - print_node_data(&state->current_node, 0); - free_node(state->current_node); - if (state->ast != NULL && run_program(\ - &state->ast->data.program, state, &prog_res)) - printf("Error when execting the Command \n"); - ast_free(state->ast); -} - -t_error get_user_input(t_state *state) -{ - t_line_state lstate; - - if (line_edit_start(&lstate, get_stdin(), get_stdout(), state->prompt)) - return (ERROR); - while (!line_edit_feed(&lstate, &state->str_input)) - { - if (errno == EAGAIN) - { - errno = 0; - lstate.pos = 0; - string_clear(&lstate.buf); - write_fd(lstate.output_fd, (void *)"^C\n", 3, NULL); - line_refresh_line(&lstate); - } - } - line_edit_stop(&lstate); - return (NO_ERROR); -} - -void ft_take_args(t_state *state) -{ - while (true) - { - state->str_input = NULL; - if (get_user_input(state)) - ft_exit(state, 1); - if (state->str_input == NULL) - ft_exit(state, 0); - line_history_add(state->str_input); - state->current_node = parse_str(state); - exec_shcat(state); - mem_free(state->str_input); - } -} - -t_first_parser *create_myparser(void) -{ - t_language *lang; - t_first_parser *parser; - - lang = tree_sitter_sh(); - parser = ts_parser_new(); - ts_parser_set_language(parser, lang); - return (parser); -} - t_i32 main(t_i32 argc, t_str argv[], t_str envp[]) { t_state state;