diff --git a/Makefile b/Makefile index 71c3676..b53fe46 100644 --- a/Makefile +++ b/Makefile @@ -5,12 +5,15 @@ CC = clang CFLAGS = -Wall -Wextra -Werror $(INCLUDES) -g VPATH = $(DIR_SRCS) -DIR_SRCS = srcs +DIR_SRCS = srcs srcs/builtins INCLUDES = -I$(HEADERS_D) -I$(LIBFT_D) HEADERS_D = ./headers -HEADERS = minishell.h +HEADERS = minishell.h \ + minishell_structs.h minishell_prototypes.h \ + minishell_macro.h minishell_term_colors.h \ + minishell_user_macro.h LIBS = -L $(LIBFT_D) -lft \ -lreadline -ltermcap @@ -18,7 +21,8 @@ LIBS = -L $(LIBFT_D) -lft \ LIBFT_D = ./libft LIBFT = $(LIBFT_D)/libft.a -SRCS = main.c +SRCS = main.c init.c generic.c \ + env.c exit.c DIR_OBJS = builds OBJS = $(SRCS:%.c=$(DIR_OBJS)/%.o) diff --git a/headers/minishell.h b/headers/minishell.h index ab2c45a..31dbb1c 100644 --- a/headers/minishell.h +++ b/headers/minishell.h @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/03 19:14:46 by lperrey #+# #+# */ -/* Updated: 2021/10/07 06:33:55 by lperrey ### ########.fr */ +/* Updated: 2021/10/10 03:37:29 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,6 +33,12 @@ # include // sudo apt install libreadline-dev # include +# include "minishell_structs.h" +# include "minishell_macro.h" +# include "minishell_term_colors.h" +# include "minishell_user_macro.h" +# include "minishell_prototypes.h" + /* ** : printf(), perror(), readline() ** : access(), unlink() diff --git a/headers/minishell_macro.h b/headers/minishell_macro.h new file mode 100644 index 0000000..9fbda6f --- /dev/null +++ b/headers/minishell_macro.h @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* minishell_macro.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/08 02:35:55 by lperrey #+# #+# */ +/* Updated: 2021/10/08 03:01:43 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef MINISHELL_MACRO_H +# define MINISHELL_MACRO_H + +// Macro RL_PROMPT_START_IGNORE == '\001' +// Macro RL_PROMPT_END_IGNORE == '\002' +# define PROMPT_CHEVRON "> " +# define PROMPT_EURO "\001€\002 \001\b\002" + +#endif diff --git a/headers/minishell_prototypes.h b/headers/minishell_prototypes.h new file mode 100644 index 0000000..3167dc4 --- /dev/null +++ b/headers/minishell_prototypes.h @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* minishell_prototypes.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/08 02:59:58 by lperrey #+# #+# */ +/* Updated: 2021/10/10 08:55:48 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef MINISHELL_PROTOTYPES_H +# define MINISHELL_PROTOTYPES_H + +// Init +int init(t_all *c, char *envp[]); + +// Builtins +int builtin_env(int argc, char *argv[], t_all *c); +int builtin_exit(int argc, char *argv[], t_all *c); + +// Generic +char *ft_strjoinfree(char *s1, char *s2); +char *ft_strjoinfree_s1(char *s1, const char *s2); +char *ft_strjoinfree_s2(const char *s1, char *s2); + +#endif diff --git a/headers/minishell_structs.h b/headers/minishell_structs.h new file mode 100644 index 0000000..6bb2bc6 --- /dev/null +++ b/headers/minishell_structs.h @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* minishell_structs.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/08 02:35:52 by lperrey #+# #+# */ +/* Updated: 2021/10/10 05:39:09 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef MINISHELL_STRUCTS_H +# define MINISHELL_STRUCTS_H + +typedef struct s_all +{ + char **envp; + char *prompt_base; + char *prompt; +} t_all; + +#endif diff --git a/headers/minishell_term_colors.h b/headers/minishell_term_colors.h new file mode 100644 index 0000000..307916b --- /dev/null +++ b/headers/minishell_term_colors.h @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* minishell_term_colors.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/08 02:37:57 by lperrey #+# #+# */ +/* Updated: 2021/10/08 02:51:13 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef MINISHELL_TERM_COLORS_H +# define MINISHELL_TERM_COLORS_H + +// https://chrisyeh96.github.io/2020/03/28/terminal-colors.html + +// Macro RL_PROMPT_START_IGNORE == '\001' +// Macro RL_PROMPT_END_IGNORE == '\002' +# define TERM_RESET "\001\e[0m\002" +# define TERM_BLACK "\001\e[0;30m\002" +# define TERM_GRAY "\001\e[1;30m\002" +# define TERM_RED "\001\e[0;31m\002" +# define TERM_LIGHT_RED "\001\e[1;31m\002" +# define TERM_GREEN "\001\e[0;32m\002" +# define TERM_LIGHT_GREEN "\001\e[1;32m\002" +# define TERM_BROWN "\001\e[0;33m\002" +# define TERM_YELLOW "\001\e[1;33m\002" +# define TERM_BLUE "\001\e[0;34m\002" +# define TERM_LIGHT_BLUE "\001\e[1;34m\002" +# define TERM_PURPLE "\001\e[0;35m\002" +# define TERM_LIGHT_PURPLE "\001\e[1;35m\002" +# define TERM_CYAN "\001\e[0;36m\002" +# define TERM_LIGHT_CYAN "\001\e[1;36m\002" +# define TERM_LIGHT_GRAY "\001\e[0;37m\002" +# define TERM_WHITE "\001\e[1;37m\002" + +#endif diff --git a/headers/minishell_user_macro.h b/headers/minishell_user_macro.h new file mode 100644 index 0000000..877191b --- /dev/null +++ b/headers/minishell_user_macro.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* minishell_user_macro.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/10 03:36:37 by lperrey #+# #+# */ +/* Updated: 2021/10/10 04:55:46 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef MINISHELL_USER_MACRO_H +# define MINISHELL_USER_MACRO_H + +# include "minishell_macro.h" + +# define USER_PROMPT PROMPT_EURO + +#endif diff --git a/srcs/builtins/env.c b/srcs/builtins/env.c new file mode 100644 index 0000000..0332bd7 --- /dev/null +++ b/srcs/builtins/env.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* env.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/10 05:01:26 by lperrey #+# #+# */ +/* Updated: 2021/10/10 07:37:29 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int builtin_env(int argc, char *argv[], t_all *c) // WIP +{ + (void)argc; + (void)argv; + ft_putendl_arr_fd(c->envp, 1); + return (0); +} diff --git a/srcs/builtins/exit.c b/srcs/builtins/exit.c new file mode 100644 index 0000000..ff88c1e --- /dev/null +++ b/srcs/builtins/exit.c @@ -0,0 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* exit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/10 05:01:22 by lperrey #+# #+# */ +/* Updated: 2021/10/10 08:50:37 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int builtin_exit(int argc, char *argv[], t_all *c) // WIP +{ + unsigned char status; + int i; + + status = 0; + if (argc > 2) + return (ft_reti_print(1, "exit: too many arguments\n", 2)); + if (argc == 2) + { + i = 0; + while (argv[1][i]) + { + if ((argv[1][0] == '-' || argv[1][0] == '+') && argv[1][1] != '\0') + i++; + while (ft_isdigit(argv[1][i])) + i++; + if (argv[1][i] != '\0') + { + ft_putstr_fd("exit: ", 2); + ft_putstr_fd(argv[1], 2); + return (ft_reti_print(2, " numeric argument required\n", 2)); + } + } + status = ft_atoi(argv[1]); + } + // TODO : remplacer exit(status) par + (void)c; + exit(status); + return (0); + // return (free_exit(&c, status)); +} diff --git a/srcs/generic.c b/srcs/generic.c new file mode 100644 index 0000000..ab88730 --- /dev/null +++ b/srcs/generic.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* generic.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/08 09:25:35 by lperrey #+# #+# */ +/* Updated: 2021/10/08 09:28:49 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *ft_strjoinfree(char *s1, char *s2) +{ + char *str; + + str = ft_strjoin(s1, s2); + free(s1); + free(s2); + return (str); +} + +char *ft_strjoinfree_s1(char *s1, const char *s2) +{ + char *str; + + str = ft_strjoin(s1, s2); + free(s1); + return (str); +} + +char *ft_strjoinfree_s2(const char *s1, char *s2) +{ + char *str; + + str = ft_strjoin(s1, s2); + free(s2); + return (str); +} diff --git a/srcs/init.c b/srcs/init.c new file mode 100644 index 0000000..207d317 --- /dev/null +++ b/srcs/init.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lperrey +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/08 09:22:12 by lperrey #+# #+# */ +/* Updated: 2021/10/10 08:54:17 by lperrey ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static char *init_prompt_base(void); +static char *init_prompt(char *prompt_base); + +int init(t_all *c, char *envp[]) +{ + ft_bzero(c, sizeof *c); + c->envp = envp; + c->prompt_base = init_prompt_base(); + if (!c->prompt_base) + return (ft_reti_perror(0, "init_prompt_base() fail")); + c->prompt = init_prompt(c->prompt_base); + if (!c->prompt) + return (ft_reti_perror(0, "init_prompt() fail")); + return (1); +} + +static char *init_prompt_base(void) +{ + char *prompt_base; + char *tmp; + + tmp = getenv("USER"); + if (!tmp) + tmp = getenv("LOGNAME"); + if (!tmp) + tmp = "NoUser"; + prompt_base = ft_strjoin(TERM_LIGHT_GREEN, tmp); + prompt_base = ft_strjoinfree_s1(prompt_base, "@"); + tmp = getenv("NAME"); + if (!tmp) + tmp = "NoName"; + prompt_base = ft_strjoinfree_s1(prompt_base, tmp); + prompt_base = ft_strjoinfree_s1(prompt_base, TERM_RESET":"TERM_LIGHT_BLUE); + return (prompt_base); +} + +static char *init_prompt(char *prompt_base) +{ + char *prompt; + + prompt = ft_strjoinfree_s2(prompt_base, getcwd(NULL, 0)); + prompt = ft_strjoinfree_s1(prompt, TERM_RESET USER_PROMPT); + return (prompt); +} diff --git a/srcs/main.c b/srcs/main.c index 6a0b110..34f6d74 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,66 +6,41 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/04 05:59:26 by lperrey #+# #+# */ -/* Updated: 2021/10/07 07:20:04 by lperrey ### ########.fr */ +/* Updated: 2021/10/10 08:50:20 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -// Macro RL_PROMPT_START_IGNORE == '\001' -// Macro RL_PROMPT_END_IGNORE == '\002' -#define TERM_RESET "\001\e[0m\002" -#define TERM_BLACK "\001\e[0;30m\002" -#define TERM_GRAY "\001\e[1;30m\002" -#define TERM_RED "\001\e[0;31m\002" -#define TERM_LIGHT_RED "\001\e[1;31m\002" -#define TERM_GREEN "\001\e[0;32m\002" -#define TERM_LIGHT_GREEN "\001\e[1;32m\002" -#define TERM_BROWN "\001\e[0;33m\002" -#define TERM_YELLOW "\001\e[1;33m\002" -#define TERM_BLUE "\001\e[0;34m\002" -#define TERM_LIGHT_BLUE "\001\e[1;34m\002" -#define TERM_PURPLE "\001\e[0;35m\002" -#define TERM_LIGHT_PURPLE "\001\e[1;35m\002" -#define TERM_CYAN "\001\e[0;36m\002" -#define TERM_LIGHT_CYAN "\001\e[1;36m\002" -#define TERM_LIGHT_GRAY "\001\e[0;37m\002" -#define TERM_WHITE "\001\e[1;37m\002" - -char *ft_strjoinfree_s1(char *s1, const char *s2) +void shell_loop(t_all *c) { - char *str; - - str = ft_strjoin(s1, s2); - free(s1); - return (str); -} - -char *ft_strjoinfree_s2(const char *s1, char *s2) -{ - char *str; - - str = ft_strjoin(s1, s2); - free(s2); - return (str); -} - -int main(int argc, char *argv[], char *envp[]) -{ - char *prompt_base; - char *prompt; char *line_input; + + line_input = NULL; + while (1) + { + if (line_input) + free(line_input); + line_input = readline(c->prompt); + if (line_input && *line_input) + { + if (!ft_strncmp(line_input, "env", 4)) // temp placeholder + builtin_env(0, NULL, c); + else if (!ft_strncmp(line_input, "exit", 5)) // temp placeholder + builtin_exit(0, NULL, c); + else + printf("echo: %s\n", line_input); + } + } +} + +void wip_test() +{ char term_desc[2048]; char *term_type; int term_width; int term_height; int ret; - - //ft_putendl_arr_fd(envp, 1); - //char *path = getenv("PATH"); - (void)argc; - (void)argv; - (void)envp; term_type = getenv("TERM"); if (term_type == 0) @@ -82,30 +57,16 @@ int main(int argc, char *argv[], char *envp[]) PC = temp ? *temp : 0; BC = tgetstr ("le", BUFFADDR); UP = tgetstr ("up", BUFFADDR); */ +} - prompt_base = ft_strjoin(TERM_LIGHT_GREEN, getenv("USER")); - prompt_base = ft_strjoinfree_s1(prompt_base, "@"); - prompt_base = ft_strjoinfree_s1(prompt_base, getenv("NAME")); - prompt_base = ft_strjoinfree_s1(prompt_base, TERM_RESET":"TERM_LIGHT_BLUE); - prompt = malloc(1); - line_input = NULL; - while (1) - { - if (line_input) - free(line_input); - free(prompt); - prompt = ft_strjoinfree_s2(prompt_base, getcwd(NULL, 0)); - prompt = ft_strjoinfree_s1(prompt, TERM_RESET"& "); - line_input = readline(prompt); - if (line_input && *line_input) - { - if (!ft_strncmp(line_input, "exit", 5)) - exit(EXIT_SUCCESS); - else - printf("echo: %s\n", line_input); - } - //rl_redisplay(); - //rl_on_new_line(); - } +int main(int argc, char *argv[], char *envp[]) +{ + t_all c; + + (void)argc; + (void)argv; + if (!init(&c, envp)) + exit(EXIT_FAILURE); + shell_loop(&c); return (0); }