From 1252ac48a87d525e5b82374dc826950fbd32bf47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl?= Date: Thu, 9 May 2024 17:16:07 +0200 Subject: [PATCH 1/2] bebou t tro for --- .clangd | 8 ++++ includes/app/env.h | 2 +- includes/app/node.h | 2 +- includes/app/node/handle_command.h | 22 ++++++++++ includes/app/node/handle_program.h | 22 ++++++++++ includes/app/state.h | 18 ++++---- includes/minishell.h | 4 +- parser/src/scanner.c | 6 +-- sources/exec/handle_command.c | 69 ++++++++++++++++++++++++++++++ sources/exec/handle_program.c | 36 ++++++++++++++++ sources/main.c | 33 +++++++++++--- sources/node/node.c | 6 +-- src.list | 2 + stdme/src/os/process.c | 4 +- stdme/src/os/process_inner.c | 5 ++- 15 files changed, 214 insertions(+), 25 deletions(-) create mode 100644 includes/app/node/handle_command.h create mode 100644 includes/app/node/handle_program.h create mode 100644 sources/exec/handle_command.c create mode 100644 sources/exec/handle_program.c diff --git a/.clangd b/.clangd index 86a1a788..7d6a1d46 100644 --- a/.clangd +++ b/.clangd @@ -17,4 +17,12 @@ CompileFlags: # Tweak the parse settings - "-I/home/maix/school/shcat/includes/" - "-I/home/maix/school/shcat/output/include/" - "-I/home/maix/school/shcat/generic_sources/header/" + - "-I/home/rparodi/Documents/shcat/vendor/" + - "-I/home/rparodi/Documents/shcat/stdme/include/" + - "-I/home/rparodi/Documents/shcat/stdme/vendor/" + - "-I/home/rparodi/Documents/shcat/stdme/output/include/" + - "-I/home/rparodi/Documents/shcat/stdme/generic_sources/header/" + - "-I/home/rparodi/Documents/shcat/includes/" + - "-I/home/rparodi/Documents/shcat/output/include/" + - "-I/home/rparodi/Documents/shcat/generic_sources/header/" diff --git a/includes/app/env.h b/includes/app/env.h index bc67b286..956ba85a 100644 --- a/includes/app/env.h +++ b/includes/app/env.h @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/04 18:41:01 by maiboyer #+# #+# */ -/* Updated: 2024/05/04 19:08:13 by maiboyer ### ########.fr */ +/* Updated: 2024/05/09 14:28:42 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/includes/app/node.h b/includes/app/node.h index 7d884d6a..34f6e00c 100644 --- a/includes/app/node.h +++ b/includes/app/node.h @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/28 18:35:22 by maiboyer #+# #+# */ -/* Updated: 2024/04/30 16:41:44 by maiboyer ### ########.fr */ +/* Updated: 2024/05/09 16:23:54 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/includes/app/node/handle_command.h b/includes/app/node/handle_command.h new file mode 100644 index 00000000..71049027 --- /dev/null +++ b/includes/app/node/handle_command.h @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* handle_command.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/09 14:42:43 by rparodi #+# #+# */ +/* Updated: 2024/05/09 14:59:28 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef HANDLE_COMMAND_H +# define HANDLE_COMMAND_H + +# include "me/types.h" +# include "app/state.h" +# include "app/node.h" + +t_error handle_command(t_node *self, t_utils *shcat, t_i32 *out_exit_code); + +#endif diff --git a/includes/app/node/handle_program.h b/includes/app/node/handle_program.h new file mode 100644 index 00000000..dd0b9ca5 --- /dev/null +++ b/includes/app/node/handle_program.h @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* handle_program.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/09 14:42:43 by rparodi #+# #+# */ +/* Updated: 2024/05/09 15:51:11 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef HANDLE_PROGRAM_H +# define HANDLE_PROGRAM_H + +# include "me/types.h" +# include "app/state.h" +# include "app/node.h" + +t_error handle_program(t_node *self, t_utils *shcat, t_i32 *out_exit_code); + +#endif diff --git a/includes/app/state.h b/includes/app/state.h index a3cef93a..4416dda4 100644 --- a/includes/app/state.h +++ b/includes/app/state.h @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/02 15:49:56 by maiboyer #+# #+# */ -/* Updated: 2024/05/04 18:40:53 by maiboyer ### ########.fr */ +/* Updated: 2024/05/09 16:23:54 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,7 @@ #include "app/node.h" #include "me/hashmap/hashmap_env.h" #include "me/types.h" +#include "me/os/process.h" typedef struct s_parser { @@ -24,13 +25,14 @@ typedef struct s_parser typedef struct s_utils { - t_str name_shell; - t_str str_input; - t_str *strs_input; - t_str *path; - t_parser parser; - t_hashmap_env *env; - t_node current_node; + t_str name_shell; + t_str str_input; + t_str *strs_input; + t_str *path; + t_parser parser; + t_hashmap_env *env; + t_node current_node; + t_process ret; } t_utils; #endif /* STATE_H */ diff --git a/includes/minishell.h b/includes/minishell.h index 6491cb55..af08e076 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/28 14:41:15 by rparodi #+# #+# */ -/* Updated: 2024/05/03 15:22:24 by maiboyer ### ########.fr */ +/* Updated: 2024/05/09 16:28:26 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,4 +48,6 @@ void ft_echo(t_str txt, t_str flag); void ft_exit(t_utils *maiboyerlpb, t_u8 exit_status); void ft_free(void *ptr); +t_error handle_node_getstr(t_node *self, t_utils *shcat, t_str *out); + #endif diff --git a/parser/src/scanner.c b/parser/src/scanner.c index 8c9677ac..a5f66327 100644 --- a/parser/src/scanner.c +++ b/parser/src/scanner.c @@ -304,8 +304,8 @@ static bool scan_heredoc_content(Scanner *scanner, t_lexer_data *lexer, enum Tok lexer->result_symbol = heredoc->started ? middle_type : end_type; lexer->mark_end(lexer); if (scan_heredoc_end_identifier(heredoc, lexer)) { - if (lexer->result_symbol == HEREDOC_END) { - array_pop(&scanner->heredocs); + if (lexer->result_symbol == HEREDOC_END) { + (void) array_pop(&scanner->heredocs); } return true; } @@ -444,7 +444,7 @@ static bool scan(Scanner *scanner, t_lexer_data *lexer, const bool *valid_symbol if (scan_heredoc_end_identifier(heredoc, lexer)) { array_delete(&heredoc->current_leading_word); array_delete(&heredoc->delimiter); - array_pop(&scanner->heredocs); + (void)array_pop(&scanner->heredocs); lexer->result_symbol = HEREDOC_END; return true; } diff --git a/sources/exec/handle_command.c b/sources/exec/handle_command.c new file mode 100644 index 00000000..ec0fbed6 --- /dev/null +++ b/sources/exec/handle_command.c @@ -0,0 +1,69 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* handle_command.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/09 15:00:53 by rparodi #+# #+# */ +/* Updated: 2024/05/09 17:14:32 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "app/env.h" +#include "app/state.h" +#include "me/types.h" +#include "gmr/symbols.h" +#include "app/node.h" +#include "me/vec/vec_str.h" +// #include "app/node/handle_program.h" +#include "app/node/handle_command.h" +#include "minishell.h" +#include "me/string/str_clone.h" +#include + +t_error handle_command(t_node *self, t_utils *shcat, t_i32 *out_exit_code) +{ + t_usize i; + t_spawn_info spawn_info; + t_str tmp; + + spawn_info.arguments = vec_str_new(self->childs_count, (void (*)(t_str))free); + if (self->kind != sym_command) + return (ERROR); + i = 0; + while (i < self->childs_count) + { + if (self->childs[i].kind == sym_command_name) + spawn_info.binary_path = str_clone(node_getstr(&self->childs[i])); + else if (self->childs[i].kind == sym_file_redirect) + printf("PAS ENCORE HANDLE FDP redirect!\n"); + else if (self->childs[i].kind == sym_variable_assignment) + printf("PAS ENCORE HANDLE FDP asignement!\n"); + else + { + printf("%s %s\n", self->childs[i].kind_str, node_getstr(&self->childs[i])); + if (handle_node_getstr(&self->childs[i], shcat, &tmp)) + return (vec_str_free(spawn_info.arguments), ERROR); + if (vec_str_push(&spawn_info.arguments, tmp)) + return (ERROR); + } + i++; + } + vec_str_push_front(&spawn_info.arguments, str_clone(spawn_info.binary_path)); + vec_str_push(&spawn_info.arguments, NULL); + spawn_info.stdin = inherited(); + spawn_info.stdout = inherited(); + spawn_info.stderr = inherited(); + spawn_info.forked_free = NULL; + if (build_envp(shcat->env, &spawn_info.environement)) + return (vec_str_free(spawn_info.arguments), ERROR); + if (spawn_process(spawn_info, &shcat->ret)) + return (ERROR); + waitpid(shcat->ret.pid, NULL, 0); + close(shcat->ret.stdin.vals.ro.fd); + close(shcat->ret.stdout.vals.ro.fd); + close(shcat->ret.stderr.vals.ro.fd); + *out_exit_code = 0; + return (NO_ERROR); +} diff --git a/sources/exec/handle_program.c b/sources/exec/handle_program.c new file mode 100644 index 00000000..b99d7d9a --- /dev/null +++ b/sources/exec/handle_program.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* handle_program.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/09 14:34:48 by rparodi #+# #+# */ +/* Updated: 2024/05/09 15:06:42 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + + +# include "app/state.h" +# include "me/types.h" +# include "gmr/symbols.h" +# include "app/node.h" +# include "app/node/handle_program.h" +# include "app/node/handle_command.h" + +t_error handle_program(t_node *self, t_utils *shcat, t_i32 *out_exit_code) +{ + t_usize i; + + if (self->kind != sym_program) + return (ERROR); + i = 0; + while (i < self->childs_count) + { + if (self->childs[i].kind == sym_command) + if (handle_command(&self->childs[i], shcat, out_exit_code)) + return (ERROR); + i++; + } + return (NO_ERROR); +} diff --git a/sources/main.c b/sources/main.c index 85005b36..cb244fdd 100644 --- a/sources/main.c +++ b/sources/main.c @@ -6,17 +6,20 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/28 14:40:38 by rparodi #+# #+# */ -/* Updated: 2024/05/04 19:21:16 by maiboyer ### ########.fr */ +/* Updated: 2024/05/09 16:51:52 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ #include "app/env.h" #include "app/node.h" +#include "app/node/handle_program.h" #include "app/signal_handler.h" #include "gmr/symbols.h" #include "me/string/str_len.h" #include "minishell.h" #include "parser/api.h" +#include "app/node/handle_concat.h" +#include t_first_parser *ts_parser_new(); void ts_tree_delete(t_first_tree *); @@ -26,6 +29,21 @@ t_first_tree *ts_parser_parse_string(t_first_parser *, t_first_tree *oldtree, void ts_parser_delete(t_first_parser *self); void ts_parser_set_language(t_first_parser *self, t_language *lang); + +t_error handle_node_getstr(t_node *self, t_utils *shcat, t_str *out) +{ + switch (self->kind) + { + case sym_word: + *out = node_getstr(self); + return (NO_ERROR); + case sym_concatenation: + return (handle_concat(self, shcat, out)); + default: + return (ERROR); + } +} + void print_node_data(t_node *t, t_usize depth) { t_usize idx; @@ -98,9 +116,12 @@ void print_node_concat(t_node *self) void exec_shcat(t_utils *shcat) { + t_i32 ret; + print_node_data(&shcat->current_node, 0); - print_node_concat(&shcat->current_node); + handle_program(&shcat->current_node, shcat, &ret); free_node(shcat->current_node); + (void)ret; } void ft_take_args(t_utils *shcat) @@ -122,7 +143,7 @@ void ft_find_path(t_str arge[], t_utils *utils) { t_i32 i; - i = 0; + i = 0; while (arge[i] != NULL) { if (arge[i][0] == 'P' && arge[i][1] == 'A' && arge[i][2] == 'T' && @@ -161,11 +182,11 @@ t_i32 main(t_i32 argc, t_str argv[], t_str envp[]) (void)argc; (void)argv; (void)envp; + utils = (t_utils){}; + utils.parser = create_myparser(); + utils.env = create_env_map(); if (install_signal()) return (1); - utils = (t_utils){}; - utils.env = create_env_map(); - utils.parser = create_myparser(); utils.name_shell = "\001\x1B[93m\002" "42sh" "\001\x1B[32m\002" diff --git a/sources/node/node.c b/sources/node/node.c index bf6817fc..b0cb7d39 100644 --- a/sources/node/node.c +++ b/sources/node/node.c @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/28 18:36:40 by maiboyer #+# #+# */ -/* Updated: 2024/04/30 16:43:35 by maiboyer ### ########.fr */ +/* Updated: 2024/05/09 17:07:22 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -88,6 +88,6 @@ void free_node(t_node t) while (idx < t.childs_count) free_node(t.childs[idx++]); free(t.childs); - if (t.single_str != NULL) - free(t.single_str); + // if (t.single_str != NULL) + // free(t.single_str); } diff --git a/src.list b/src.list index 22c57427..7a7d017a 100644 --- a/src.list +++ b/src.list @@ -1,6 +1,8 @@ env.c +exec/handle_command.c exec/handle_concat.c exec/handle_expension.c +exec/handle_program.c exec/handle_raw_word.c exec/handle_word.c ft_cmd.c diff --git a/stdme/src/os/process.c b/stdme/src/os/process.c index 70b6b5f4..39ed6b59 100644 --- a/stdme/src/os/process.c +++ b/stdme/src/os/process.c @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/03 16:22:41 by maiboyer #+# #+# */ -/* Updated: 2024/04/30 21:17:22 by maiboyer ### ########.fr */ +/* Updated: 2024/05/09 16:55:16 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -84,6 +84,8 @@ t_error find_binary(t_spawn_info *info, t_process *process) t_buffer_str s; (void)(process); + if (info->binary_path == NULL) + return (ERROR); s = alloc_new_buffer(256); if (str_start_with(info->binary_path, "/") || str_find_chr(info->binary_path, '/') != NULL) diff --git a/stdme/src/os/process_inner.c b/stdme/src/os/process_inner.c index 25fec826..18ac06f7 100644 --- a/stdme/src/os/process_inner.c +++ b/stdme/src/os/process_inner.c @@ -6,11 +6,12 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/04 22:25:44 by maiboyer #+# #+# */ -/* Updated: 2024/01/04 22:26:10 by maiboyer ### ########.fr */ +/* Updated: 2024/05/09 16:57:24 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ #include "me/types.h" +#include bool find_null(const t_str *s) { @@ -29,5 +30,7 @@ bool str_start_with(t_const_str s, t_const_str prefix) bool find_path(const t_str *s) { + if (*s == NULL) + return (false); return (str_start_with(*s, "PATH=")); } From 2c75731e5d095841792343bbae89c36cf115186e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl?= Date: Thu, 9 May 2024 17:26:53 +0200 Subject: [PATCH 2/2] added things to do --- to_do_raph.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 to_do_raph.md diff --git a/to_do_raph.md b/to_do_raph.md new file mode 100644 index 00000000..c663695c --- /dev/null +++ b/to_do_raph.md @@ -0,0 +1,2 @@ +# Important: +- Parse envp and put it in shcat->env with functions in `me/hashmap/hashmap_env.h`