diff --git a/inc/signals.h b/inc/signals.h index f5da238a..98bdf0ac 100644 --- a/inc/signals.h +++ b/inc/signals.h @@ -20,7 +20,7 @@ # include "shell.h" /* signals */ -void signal_reset_prompt(int signo); +void signal_reset_prompt(int signo); void set_signals_interactive(void); void signal_print_newline(int signal); void sigquit_ignore(void); diff --git a/inc/tokens.h b/inc/tokens.h index bb43e300..ff28e838 100644 --- a/inc/tokens.h +++ b/inc/tokens.h @@ -62,6 +62,10 @@ typedef struct s_loop_data t_ast *tree; } t_loop_data; +void final_quote_removal(int arg_count, t_ast *command_node); +char *expand_env_var(char *arg, t_ms_data *data); +void post_process_command_args(t_ast *command_node, int arg_count, \ + t_ms_data *data); void add_node(t_token **head, char *str); void print_stack(t_token **stack); void free_stack(t_token **stack); diff --git a/src/builtins/cd.c b/src/builtins/cd.c index 54bd3c40..79a3d872 100644 --- a/src/builtins/cd.c +++ b/src/builtins/cd.c @@ -29,7 +29,7 @@ int builtin_cd(t_ms_data *data) char *home_dir; char cwd[4096]; - printf("builtin_cd\n"); + ft_printf("builtin_cd\n"); home_dir = get_env(data->envp, "HOME"); target_dir = (char *)data->args[1]; if (!target_dir) diff --git a/src/builtins/export.c b/src/builtins/export.c index 6ce0dd85..6904bf16 100644 --- a/src/builtins/export.c +++ b/src/builtins/export.c @@ -23,7 +23,6 @@ */ int builtin_export(t_ms_data *data); -// static bool check_input(t_ms_data *data); static void add_env(t_ms_data *data); int builtin_export(t_ms_data *data) @@ -47,7 +46,6 @@ int builtin_export(t_ms_data *data) } else add_env(data); - // if (check_input(data)) return (0); } diff --git a/src/execute/execute.c b/src/execute/execute.c index dc0278ce..6af9b451 100644 --- a/src/execute/execute.c +++ b/src/execute/execute.c @@ -41,7 +41,7 @@ int execute_ast(t_ast *node, t_ms_data *data) if (node->type == PIPE) return (builtin_pipe(node, data)); else if (node->type == ENV_VAR) - printf(BLU"ENV_VAR\n"RESET); + ft_printf(BLU"ENV_VAR\n"RESET); else if (node->type == REDIR_IN) return (redirect_in(node, data)); else if (node->type == REDIR_OUT) diff --git a/src/main.c b/src/main.c index 99e1aeff..fcdf167b 100644 --- a/src/main.c +++ b/src/main.c @@ -31,6 +31,18 @@ void main_loop(t_ms_data *data, t_loop_data *loop_data) { int status; + print_ast_root(loop_data->tree); + status = execute_ast(loop_data->tree, data); + if (status_handler(status, loop_data)) + { + handle_io_fd(data); + loop_cleanup(loop_data->trimmed_input, loop_data->tokens, \ + loop_data->prompt, loop_data->tree); + } +} + +void main_loop(t_ms_data *data, t_loop_data *loop_data) +{ while (1) { loop_data->prompt = generate_prompt(data); @@ -44,7 +56,8 @@ void main_loop(t_ms_data *data, t_loop_data *loop_data) } make_history(loop_data->input); loop_data->trimmed_input = trim_input(loop_data->input); - input_error_checks(loop_data->trimmed_input); + if (input_error_checks(loop_data->trimmed_input)) + continue ; loop_data->tokens = tokenise(loop_data->trimmed_input); loop_data->tree = parse_tokens(&loop_data->tokens, data); print_ast_root(loop_data->tree); diff --git a/src/parser/heredoc.c b/src/parser/heredoc.c deleted file mode 100644 index 6b44d197..00000000 --- a/src/parser/heredoc.c +++ /dev/null @@ -1,40 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* heredoc.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: rmikhayl +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/06/06 17:04:22 by rmikhayl #+# #+# */ -/* Updated: 2024/06/06 18:13:53 by rmikhayl ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "tokens.h" - -char *check_heredoc(char *line) -{ - char **parsed; - - parsed = ft_split(line, ' '); - if (!ft_strcmp(parsed[0], "cat") && !ft_strcmp(parsed[1], "<<")) - return (heredoc("EOF")); - else - return (line); -} - -char *heredoc(char *eof) -{ - char *line; - char *comb; - - comb = ""; - while (1) - { - line = readline("heredoc>"); - if (!ft_strcmp(line, eof)) - return (comb); - comb = ft_strjoin(ft_strjoin(comb, line), "\n"); - free(line); - } -} diff --git a/src/parser/parser.c b/src/parser/parser.c index 82744720..d7015065 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -6,7 +6,7 @@ /* By: rocky +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/12 19:35:45 by rocky #+# #+# */ -/* Updated: 2024/07/11 18:44:23 by dmdemirk ### ########.fr */ +/* Updated: 2024/08/28 20:11:50 by rocky ### ########.fr */ /* */ /* ************************************************************************** */ @@ -113,4 +113,4 @@ t_ast *manage_pipe(t_token **tokens, t_ms_data *data) *tokens = next_token; } return (manage_redirs(&tmp, data)); -} \ No newline at end of file +} diff --git a/src/parser/parser_helper_helpers.c b/src/parser/parser_helper_helpers.c new file mode 100644 index 00000000..96683f42 --- /dev/null +++ b/src/parser/parser_helper_helpers.c @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_helper_helpers.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rocky +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/28 20:36:33 by rocky #+# #+# */ +/* Updated: 2024/08/28 20:36:39 by rocky ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "tokens.h" + +void final_quote_removal(int arg_count, t_ast *command_node) +{ + int i; + size_t len; + char *arg; + char *trimmed_arg; + + i = 0; + while (i < arg_count) + { + arg = command_node->args[i]; + len = ft_strlen(arg); + if ((arg[0] == '"' && arg[len - 1] == '"') || (arg[0] == '\'' \ + && arg[len - 1] == '\'')) + { + trimmed_arg = ft_strndup(arg + 1, len - 2); + free(command_node->args[i]); + command_node->args[i] = trimmed_arg; + } + i++; + } +} + +char *expand_env_var(char *arg, t_ms_data *data) +{ + char *env_value; + + if (ft_strcmp(arg, "$?") == 0) + return (ft_itoa(data->exit_status)); + else if (arg[0] == '$') + { + if (arg[ft_strlen(arg) - 1] == '"') + arg[ft_strlen(arg) - 1] = '\0'; + env_value = get_env(data->envp, arg + 1); + if (env_value) + return (ft_strdup(env_value)); + } + return (ft_strdup(arg)); +} + +void post_process_command_args(t_ast *command_node, int arg_count, \ + t_ms_data *data) +{ + int i; + char *arg; + char *processed_arg; + + i = 0; + while (i < arg_count) + { + arg = command_node->args[i]; + processed_arg = NULL; + if (arg[0] == '$' || (arg[0] == '"' && arg[1] == '$')) + { + if (arg[0] == '"') + processed_arg = expand_env_var(arg + 1, data); + else + processed_arg = expand_env_var(arg, data); + } + else if (arg[0] == '\'') + processed_arg = ft_strdup(arg); + else + processed_arg = ft_strdup(arg); + free(command_node->args[i]); + command_node->args[i] = processed_arg; + i++; + } + final_quote_removal(arg_count, command_node); +} diff --git a/src/parser/parser_helpers.c b/src/parser/parser_helpers.c index e5724083..831cd120 100644 --- a/src/parser/parser_helpers.c +++ b/src/parser/parser_helpers.c @@ -5,8 +5,8 @@ /* +:+ +:+ +:+ */ /* By: rocky +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/06/14 10:45:48 by rocky #+# #+# */ -/* Updated: 2024/06/17 11:06:25 by rocky ### ########.fr */ +/* Created: 2024/08/28 20:13:42 by rocky #+# #+# */ +/* Updated: 2024/08/28 20:14:33 by rocky ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/parser/tokeniser.c b/src/parser/tokeniser.c index 1dfef353..ab2625cf 100644 --- a/src/parser/tokeniser.c +++ b/src/parser/tokeniser.c @@ -97,7 +97,7 @@ void print_tokens(t_token *tokens) token = tokens; while (token != NULL) { - printf("input[%d] -> %s \n", i, token->data); + ft_printf("input[%d] -> %s \n", i, token->data); token = token->next; i++; } diff --git a/src/test/env/env_test.c b/src/test/env/env_test.c index 4824c231..f48885e7 100644 --- a/src/test/env/env_test.c +++ b/src/test/env/env_test.c @@ -24,7 +24,7 @@ void test_unset_env(t_ms_data *data); void env_tests(t_ms_data *data, char **envp) { - printf("\nENV TESTS\n"); + ft_printf("\nENV TESTS\n"); test_init_env(data, envp); test_get_env(data, envp); test_set_env(data, envp); @@ -48,10 +48,10 @@ void test_init_env(t_ms_data *data, char **envp) while (test_envp[test_envp_count]) test_envp_count++; assert(envp_count == test_envp_count); - printf("\033[0m"); - printf("\033[0;32m"); - printf("init_env -> OK\n"); - printf("\033[0m"); + ft_printf("\033[0m"); + ft_printf("\033[0;32m"); + ft_printf("init_env -> OK\n"); + ft_printf("\033[0m"); } void test_get_env(t_ms_data *data, char **envp) @@ -63,10 +63,10 @@ void test_get_env(t_ms_data *data, char **envp) value = get_env(data->envp, "LOGNAME"); assert(value != NULL); assert(ft_strcmp(value, getenv("LOGNAME")) == 0); - printf("\033[0m"); - printf("\033[0;32m"); - printf("get_env -> OK\n"); - printf("\033[0m"); + ft_printf("\033[0m"); + ft_printf("\033[0;32m"); + ft_printf("get_env -> OK\n"); + ft_printf("\033[0m"); } void test_set_env(t_ms_data *data, char **envp) @@ -79,10 +79,10 @@ void test_set_env(t_ms_data *data, char **envp) value = get_env(data->envp, "TEST"); assert(value != NULL); assert(ft_strcmp(value, "test") == 0); - printf("\033[0m"); - printf("\033[0;32m"); - printf("set_env -> OK\n"); - printf("\033[0m"); + ft_printf("\033[0m"); + ft_printf("\033[0;32m"); + ft_printf("set_env -> OK\n"); + ft_printf("\033[0m"); } void test_unset_env(t_ms_data *data) @@ -96,8 +96,8 @@ void test_unset_env(t_ms_data *data) unset_env(&data->envp, "TEST"); value = get_env(data->envp, "TEST"); assert(value == NULL); - printf("\033[0m"); - printf("\033[0;32m"); - printf("unset_env -> OK\n"); - printf("\033[0m"); + ft_printf("\033[0m"); + ft_printf("\033[0;32m"); + ft_printf("unset_env -> OK\n"); + ft_printf("\033[0m"); } diff --git a/src/test/main.c b/src/test/main.c index d6be44fc..3f74bb1c 100644 --- a/src/test/main.c +++ b/src/test/main.c @@ -21,7 +21,7 @@ int main(int argc, char **argv, char **envp) if (argc > 1) { - printf("Usage: %s\n", argv[0]); + ft_printf("Usage: %s\n", argv[0]); exit(EXIT_FAILURE); } pipe_tests(&data); diff --git a/src/test/pipe/pipe_test.c b/src/test/pipe/pipe_test.c index 48d00ad8..42a205b3 100644 --- a/src/test/pipe/pipe_test.c +++ b/src/test/pipe/pipe_test.c @@ -21,12 +21,12 @@ void pipe_tests(t_ms_data *data); void pipe_tests(t_ms_data *data) { - printf("\nPIPE TESTS\n"); + ft_printf("\nPIPE TESTS\n"); builtin_pipe_test(data); - printf("\033[0m"); - printf("\033[0;32m"); - printf("pipe_test -> OK\n"); - printf("\033[0m"); + ft_printf("\033[0m"); + ft_printf("\033[0;32m"); + ft_printf("pipe_test -> OK\n"); + ft_printf("\033[0m"); } void builtin_pipe_test(t_ms_data *data) diff --git a/src/utils/initialise.c b/src/utils/initialise.c index 4c651d19..22f82390 100644 --- a/src/utils/initialise.c +++ b/src/utils/initialise.c @@ -31,7 +31,7 @@ void initialise(int argc, char **argv) { if (argc > 1) { - printf("Usage: %s\n", argv[0]); + ft_printf("Usage: %s\n", argv[0]); exit(EXIT_FAILURE); } read_history(HISTORY_PATH); diff --git a/src/utils/prompt.c b/src/utils/prompt.c index e6472474..bb2d630b 100644 --- a/src/utils/prompt.c +++ b/src/utils/prompt.c @@ -6,46 +6,30 @@ /* By: rmikhayl +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/05 13:58:23 by rmikhayl #+# #+# */ -/* Updated: 2024/07/11 18:45:32 by dmdemirk ### ########.fr */ +/* Updated: 2024/08/28 20:10:27 by rocky ### ########.fr */ /* */ /* ************************************************************************** */ #include "tokens.h" #include "env.h" -/* -todo: -extract and print only after LOGNAME - -!wrong example: -🌴 dmdemirk@maxishell:~/home/dmdemirk/Documents/minishell> - -correct example: -🌴 dmdemirk@maxishell:~/Documents/minishell> - */ - char *generate_prompt(t_ms_data *data); char *generate_prompt_string(t_ms_data *data, char *pwd, \ char *home_dir); - char *generate_prompt(t_ms_data *data) { char *prompt; size_t prompt_len; - prompt_len = strlen("🌴\e[1m @maxishell:~> \e[m") + \ - strlen(getenv("LOGNAME")) + \ - ft_strlen(getenv("PWD")) + \ - 1; + prompt_len = ft_strlen("🌴\e[1m @maxishell$ \e[m") + \ + ft_strlen(getenv("LOGNAME")); prompt = (char *)malloc(prompt_len); if (!prompt) exit(EXIT_FAILURE); ft_strcpy(prompt, "🌴\e[1m "); ft_strcat(prompt, getenv("LOGNAME")); - ft_strcat(prompt, "@maxishell:~"); - ft_strcat(prompt, getenv("PWD")); - ft_strcat(prompt, "> \e[m"); + ft_strcat(prompt, "@maxishell$ \e[m"); (void)data; return (prompt); } @@ -86,7 +70,7 @@ void print_maxishell(void) "β•šβ•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•\n"); ft_printf("\n"); ft_printf(" \033[1;34m" - "Version 0.0.0\033[0m\n"); + "Version 1.0.0\033[0m\n"); ft_printf(" \033[1;36m" "By Димас ΠΈ Ромас\033[0m\n"); ft_printf("\n"); diff --git a/src/utils/visualiser.c b/src/utils/visualiser.c index 3a908a21..d51cbda2 100644 --- a/src/utils/visualiser.c +++ b/src/utils/visualiser.c @@ -38,23 +38,23 @@ void print_ast_node(t_ast *node, int depth, char *prefix, int is_left) if (!node) return ; - printf("%s", prefix); + ft_printf("%s", prefix); if (depth == 0) - printf("Root-> "); + ft_printf("Root-> "); else { if (is_left) - printf("L-> "); + ft_printf("L-> "); else - printf("R-> "); + ft_printf("R-> "); } - printf("Type: %s\n", get_token_type_name(node->type)); + ft_printf("Type: %s\n", get_token_type_name(node->type)); if (node->args) { i = 0; while (node->args[i]) { - printf("%s Arg: %s\n", prefix, node->args[i]); + ft_printf("%s Arg: %s\n", prefix, node->args[i]); i++; } }