minishell/src/prompt/prompt.c
2025-03-02 22:15:46 +01:00

118 lines
3.1 KiB
C

/* ************************************************************************** */
/* */
/* :::::::: */
/* prompt.c :+: :+: */
/* +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */
/* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */
/* Updated: 2025/03/02 22:13:52 by whaffman ######## odam.nl */
/* */
/* ************************************************************************** */
#include "minishell.h"
char *get_user(t_minishell *msh)
{
int len;
t_environment *user;
char *username;
char *result;
const char *prompt = RESET "🐚" GREEN "minishell" RESET ": ";
user = environment_get(msh, "USER");
if (user == NULL)
username = "guest";
else
username = user->value;
len = ft_strlen(username) + ft_strlen(prompt) + ft_strlen(GREEN) + 1;
result = (char *)malloc_safe(msh, len);
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(t_minishell *msh, char *cwd)
{
t_environment *home;
int home_len;
home = environment_get(msh, "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_minishell *msh)
{
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(msh, cwd);
len = ft_strlen(cwd) - home_len + 1;
result = malloc_safe(msh, len);
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_minishell *msh)
{
char *result;
char *cwd;
int len;
cwd = get_path_with_home(msh);
if (cwd == NULL)
return (NULL);
len = ft_strlen(cwd) + ft_strlen(BLUE RESET "> ") + 1;
result = malloc_safe(msh, len);
ft_strlcpy(result, BLUE, len);
ft_strlcat(result, cwd, len);
ft_strlcat(result, RESET "> ", len);
free_safe(msh, (void **) &cwd);
return (result);
}
char *ft_prompt(t_minishell *msh)
{
char *line;
char *cwd;
char *prompt;
char *user;
if (PROMPT)
line = readline(PROMPT);
else
{
cwd = get_path(msh);
if (cwd == NULL)
return (NULL);
user = get_user(msh);
if (user == NULL)
return (free(cwd), NULL);
prompt = ft_strjoin_safe(msh, user, cwd);
free_safe(msh, (void **)&user);
free_safe(msh, (void **)&cwd);
rl_on_new_line();
line = readline(prompt);
free_safe(msh, (void **)&prompt);
}
if (line != NULL && *line != '\0')
history_write(line);
return (line);
}