minishell/src/prompt/prompt.c
2025-02-19 13:58:50 +01:00

131 lines
3.2 KiB
C

/* ************************************************************************** */
/* */
/* :::::::: */
/* prompt.c :+: :+: */
/* +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */
/* 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);
}