From a1b064fdfce24fe4e196dad1b336a804f494f284 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 12 Feb 2025 13:00:51 +0100 Subject: [PATCH] fixed many malloc in prompt, chaged name history, added command to front of arg list so that its argv[0] --- inc/minishell.h | 3 +- inc/prompt.h | 6 +- src/main.c | 6 +- src/parser/parser_get_arguments.c | 18 ++-- .../{ft_load_history.c => history_load.c} | 6 +- .../{ft_write_history.c => history_write.c} | 7 +- src/prompt/prompt.c | 93 +++++++++++++------ src/utils/simple_builtins.c | 2 +- 8 files changed, 90 insertions(+), 51 deletions(-) rename src/prompt/{ft_load_history.c => history_load.c} (87%) rename src/prompt/{ft_write_history.c => history_write.c} (84%) diff --git a/inc/minishell.h b/inc/minishell.h index d67e2fe..7c820b9 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:13 by whaffman #+# #+# */ -/* Updated: 2025/02/11 15:50:21 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 10:59:38 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -38,5 +38,6 @@ # define CYAN "\001\033[0;36m\002" # define RESET "\001\033[0m\002" # define PROMPT RESET "🐚" GREEN "minishell" RESET ": " +# define PROMPT_LEN 51 #endif diff --git a/inc/prompt.h b/inc/prompt.h index 155de23..3ed41c4 100644 --- a/inc/prompt.h +++ b/inc/prompt.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:35:35 by whaffman #+# #+# */ -/* Updated: 2025/02/05 17:05:32 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 12:54:01 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ void print_banner(void); char *ft_prompt(t_minishell *minishell); -void ft_write_history(char *line); -void ft_load_history(void); +void history_write(char *line); +void history_load(void); #endif // PROMPT_H diff --git a/src/main.c b/src/main.c index 5944a3f..6a1a2b4 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:19:22 by whaffman #+# #+# */ -/* Updated: 2025/02/08 14:09:11 by willem ######## odam.nl */ +/* Updated: 2025/02/12 12:54:01 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ int main(int argc, char **argv, char **envp) (void)argc; (void)argv; print_banner(); - ft_load_history(); + history_load(); minishell = init_minishell(); environment_parse(envp, &(minishell->environment)); while (TRUE) @@ -38,7 +38,7 @@ int main(int argc, char **argv, char **envp) minishell->lexer = ft_lexer_new(minishell->line); minishell->tokens = ft_parse_input(minishell->lexer); ft_lstiter(minishell->tokens, token_print); - // minishell->commands = parser_get_commands(minishell->tokens); + minishell->commands = parser_get_commands(minishell->tokens); simple_builtins(minishell); free_minishell_line(minishell); ft_lstclear(&minishell->commands, free_command_list); diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c index 8fa4fa8..2b428ce 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* parser_get_arguments.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ -/* Updated: 2025/02/11 16:26:41 by qmennen ### ########.fr */ +/* :::::::: */ +/* parser_get_arguments.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ +/* Updated: 2025/02/12 12:58:42 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -26,7 +26,7 @@ static int count_cmds(t_list *list) cmds++; current = current->next; } - return (cmds - 1); + return (cmds); } char **parser_get_arguments(t_list *list) @@ -43,7 +43,7 @@ char **parser_get_arguments(t_list *list) perror("malloc"); exit(EXIT_FAILURE); } - current = list->next; + current = list; i = -1; while ((++i) < cmds && current) { diff --git a/src/prompt/ft_load_history.c b/src/prompt/history_load.c similarity index 87% rename from src/prompt/ft_load_history.c rename to src/prompt/history_load.c index cd1816e..2094bec 100644 --- a/src/prompt/ft_load_history.c +++ b/src/prompt/history_load.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* ft_load_history.c :+: :+: */ +/* history_load.c :+: :+: */ /* +:+ */ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:44:51 by whaffman #+# #+# */ -/* Updated: 2025/02/05 17:11:59 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 12:54:04 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_load_history(void) +void history_load(void) { int fd; char *line; diff --git a/src/prompt/ft_write_history.c b/src/prompt/history_write.c similarity index 84% rename from src/prompt/ft_write_history.c rename to src/prompt/history_write.c index 38f9901..86caf61 100644 --- a/src/prompt/ft_write_history.c +++ b/src/prompt/history_write.c @@ -1,21 +1,22 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* ft_write_history.c :+: :+: */ +/* history_write.c :+: :+: */ /* +:+ */ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 17:12:17 by whaffman #+# #+# */ -/* Updated: 2025/02/05 17:12:23 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 12:53:42 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_write_history(char *line) +void history_write(char *line) { int fd; + add_history(line); fd = open(".minishell_history", O_WRONLY | O_APPEND | O_CREAT, 0644); if (fd < 0) return ; diff --git a/src/prompt/prompt.c b/src/prompt/prompt.c index 26a5fbe..81b9293 100644 --- a/src/prompt/prompt.c +++ b/src/prompt/prompt.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ -/* Updated: 2025/02/11 16:06:17 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 12:53:38 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ char *get_user(t_list *environment) username = (char *)guest; else username = user->value; - len = ft_strlen(username) + ft_strlen(PROMPT) + ft_strlen(GREEN) + 1; + len = ft_strlen(username) + ft_strlen(PROMPT GREEN) + 1; result = (char *)malloc(len); if (result == NULL) { @@ -38,30 +38,65 @@ char *get_user(t_list *environment) return (result); } -char *get_path(t_list *environment) +int get_home_len(char *cwd, t_list *environment) { - char *home; - char *temp; - char *cwd; + t_environment *home; + int home_len; + + home = environment_get(environment, "HOME"); + home_len = 0; + if (home && !ft_strncmp(cwd, home->value, ft_strlen(home->value))) + home_len = ft_strlen(home->value) - 1; + return (home_len); +} + +char *get_path_with_home(t_list *environment) +{ + char *result; + char *cwd; + int len; + int home_len; cwd = getcwd(NULL, 0); - home = environment_get(environment, "HOME")->value; if (cwd == NULL) + return (perror("getcwd"), NULL); + home_len = get_home_len(cwd, environment); + len = ft_strlen(cwd) - home_len + 1; + result = malloc(len); + if (result == NULL) + return (free(cwd), NULL); + if (home_len) { - perror("getcwd"); - return (NULL); + ft_strlcpy(result, "~", 2); + ft_strlcat(result, cwd + home_len + 1, len); } - if (home && ft_strncmp(cwd, home, ft_strlen(home)) == 0) - { - temp = ft_strjoin("~", cwd + ft_strlen(home)); - free(cwd); - cwd = temp; - } - temp = ft_strjoin(BLUE, cwd); + else + ft_strlcpy(result, cwd, len); free(cwd); - cwd = ft_strjoin(temp, RESET); - free(temp); - return (cwd); + return (result); +} + +char *get_path(t_list *environment) +{ + char *result; + char *cwd; + int len; + + cwd = get_path_with_home(environment); + if (cwd == NULL) + return (NULL); + len = ft_strlen(cwd) + ft_strlen(BLUE RESET "> ") + 1; + result = malloc(len); + if (result == NULL) + { + perror("malloc"); + return (free(cwd), NULL); + } + ft_strlcpy(result, BLUE, len); + ft_strlcat(result, cwd, len); + ft_strlcat(result, RESET "> ", len); + free(cwd); + return (result); } char *ft_prompt(t_minishell *minishell) @@ -70,23 +105,25 @@ char *ft_prompt(t_minishell *minishell) char *cwd; char *prompt; char *user; - char *temp; cwd = get_path(minishell->environment); if (cwd == NULL) return (NULL); user = get_user(minishell->environment); - temp = ft_strjoin(user, cwd); + if (user == NULL) + return (free(cwd), NULL); + prompt = ft_strjoin(user, cwd); + if (prompt == NULL) + { + perror("malloc"); + return (free(cwd), free(user), NULL); + } free(user); free(cwd); - prompt = ft_strjoin(temp, "> "); - free(temp); line = readline(prompt); free(prompt); - if (line != NULL) - { - add_history(line); - ft_write_history(line); - } + if (line == NULL) + return (NULL); + history_write(line); return (line); } diff --git a/src/utils/simple_builtins.c b/src/utils/simple_builtins.c index 11169fb..e50b454 100644 --- a/src/utils/simple_builtins.c +++ b/src/utils/simple_builtins.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:21:39 by whaffman #+# #+# */ -/* Updated: 2025/02/11 17:11:16 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 12:52:30 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */