/* ************************************************************************** */ /* */ /* :::::::: */ /* prompt.c :+: :+: */ /* +:+ */ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ /* Updated: 2025/02/19 13:44:20 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" char *get_user(t_list *environment) { const char guest[] = "guest"; int len; t_environment *user; char *username; char *result; user = environment_get(environment, "USER"); if (user == NULL) username = (char *)guest; else username = user->value; len = ft_strlen(username) + ft_strlen(PROMPT GREEN) + 1; result = (char *)malloc(len); if (result == NULL) { perror("malloc"); return (NULL); } ft_strlcpy(result, GREEN, ft_strlen(GREEN) + 1); ft_strlcat(result, username, ft_strlen(GREEN) + ft_strlen(username) + 1); ft_strlcat(result, PROMPT, len); return (result); } int get_home_len(char *cwd, t_list *environment) { 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); 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) { ft_strlcpy(result, "~", 2); ft_strlcat(result, cwd + home_len + 1, len); } else ft_strlcpy(result, cwd, len); free(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) { char *line; char *cwd; char *prompt; char *user; cwd = get_path(minishell->environment); if (cwd == NULL) return (NULL); user = get_user(minishell->environment); 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); rl_on_new_line(); line = readline(prompt); free(prompt); if (line == NULL) return (NULL); history_write(line); return (line); }