131 lines
3.2 KiB
C
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);
|
|
}
|