diff --git a/Makefile b/Makefile index 09af8325..633a3dda 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: rparodi +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2023/11/12 11:05:05 by rparodi #+# #+# # -# Updated: 2024/03/31 19:52:25 by rparodi ### ########.fr # +# Updated: 2024/04/01 01:49:49 by rparodi ### ########.fr # # # # **************************************************************************** # @@ -26,10 +26,19 @@ RM = rm -rf CFLAGS = -Werror -Wextra -Wall -Wno-unused-command-line-argument -g3 -MMD -lreadline # Sources -LIB = ./libft/ft_split.c \ - ./libft/ft_strcmp.c +LIB = ./libft/ft_bzero.c \ + ./libft/ft_calloc.c \ + ./libft/ft_memset.c \ + ./libft/ft_split.c \ + ./libft/ft_strcmp.c \ + ./libft/ft_strdup.c \ + ./libft/ft_strlcpy.c \ + ./libft/ft_strlen.c -SRC = ./sources/ft_exit.c\ +SRC = ./sources/ft_cmd.c \ + ./sources/ft_echo.c \ + ./sources/ft_exit.c \ + ./sources/ft_pwd.c \ ./sources/main.c # Objects diff --git a/includes/minishell.h b/includes/minishell.h index f8224d92..e35e2dd6 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/28 14:41:15 by rparodi #+# #+# */ -/* Updated: 2024/03/31 21:04:32 by rparodi ### ########.fr */ +/* Updated: 2024/04/01 01:51:57 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,10 +27,29 @@ # include # include -t_i32 main(void); -t_i32 ft_strcmp(const char *s1, const char *s2); -t_i32 ft_check_type_operators(t_i8 **operators); -void ft_exit(t_str str, t_u8 exit_status); -t_str *ft_split(t_const_str s, t_i8 c); +typedef struct s_utils +{ + t_str name_shell; + t_str str_input; + t_str *strs_input; + t_str *path; + t_str *envp; +} t_utils; + +t_i32 main(t_i32 argc, t_str argv[], t_str arge[]); +void ft_other_cmd(t_utils *shcat, t_usize i); +t_i32 ft_strcmp(const char *s1, const char *s2); +t_i32 ft_check_type_operators(t_i8 **operators); +t_str *ft_split(t_const_str s, t_i8 c); +t_str ft_strdup(t_const_str s); +void *ft_calloc(t_usize nmemb, t_usize size); +size_t ft_strlen(t_const_str s); +t_usize ft_strlcpy(t_str dst, t_const_str src, t_usize size); +void *ft_memset(void *s, t_i32 c, t_usize n); +void ft_bzero(void *s, t_usize n); +void ft_free_strs(t_str *strs); +void ft_pwd(void); +void ft_echo(t_str txt, t_str flag); +void ft_exit(t_utils *maiboyerlpb, t_u8 exit_status); #endif diff --git a/libft/ft_bzero.c b/libft/ft_bzero.c new file mode 100644 index 00000000..c65ffc33 --- /dev/null +++ b/libft/ft_bzero.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_bzero.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/11/07 16:43:13 by rparodi #+# #+# */ +/* Updated: 2024/03/31 22:29:48 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/minishell.h" + +void ft_bzero(void *s, t_usize n) +{ + ft_memset(s, 0, n); +} diff --git a/libft/ft_calloc.c b/libft/ft_calloc.c new file mode 100644 index 00000000..d0bacd7b --- /dev/null +++ b/libft/ft_calloc.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_calloc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/11/07 16:47:17 by rparodi #+# #+# */ +/* Updated: 2024/03/31 22:32:48 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/minishell.h" + +void *ft_calloc(t_usize nmemb, t_usize size) +{ + t_usize total; + t_str to_return; + + if (nmemb == 0 || size == 0) + return ((void *)malloc(1)); + total = nmemb * size; + if (total / nmemb != size && total / size != nmemb) + return (NULL); + to_return = (char *)malloc(total); + if (to_return == NULL) + to_return = NULL; + else + ft_bzero(to_return, total); + return (to_return); +} diff --git a/libft/ft_memset.c b/libft/ft_memset.c new file mode 100644 index 00000000..77c4792b --- /dev/null +++ b/libft/ft_memset.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/11/07 16:50:29 by rparodi #+# #+# */ +/* Updated: 2024/03/31 22:32:32 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/minishell.h" + +void *ft_memset(void *s, t_i32 c, t_usize n) +{ + t_str str; + t_usize i; + + i = 0; + str = (t_str)s; + while (i < n) + { + str[i] = c; + i++; + } + return (str); +} diff --git a/libft/ft_strcmp.c b/libft/ft_strcmp.c index 92835be9..b0bd8147 100644 --- a/libft/ft_strcmp.c +++ b/libft/ft_strcmp.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_strncmp.c :+: :+: :+: */ +/* ft_strcmp.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/07 16:56:56 by rparodi #+# #+# */ -/* Updated: 2024/03/31 19:51:17 by rparodi ### ########.fr */ +/* Updated: 2024/03/31 21:57:48 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ int ft_strcmp(const char *s1, const char *s2) i = 0; while ((s1[i] || s2[i])) { - if (s1[i] != s2[i]) + if (s1[i] != s2[i] && s1 && s2) { diff = (unsigned char)s1[i] - (unsigned char)s2[i]; return (diff); diff --git a/libft/ft_strdup.c b/libft/ft_strdup.c new file mode 100644 index 00000000..fae4f328 --- /dev/null +++ b/libft/ft_strdup.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strdup.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/11/07 16:53:59 by rparodi #+# #+# */ +/* Updated: 2024/04/01 01:41:35 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/minishell.h" + +t_str ft_strdup(t_const_str s) +{ + t_usize len; + t_str to_return; + + len = ft_strlen(s) + 1; + to_return = (t_str)malloc(sizeof(t_i8) * len); + if (!to_return) + return (NULL); + ft_strlcpy(to_return, s, len); + return (to_return); +} diff --git a/libft/ft_strlcpy.c b/libft/ft_strlcpy.c new file mode 100644 index 00000000..7a30a290 --- /dev/null +++ b/libft/ft_strlcpy.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/11/07 16:55:25 by rparodi #+# #+# */ +/* Updated: 2024/04/01 01:38:28 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/minishell.h" + +t_usize ft_strlcpy(t_str dst, t_const_str src, t_usize size) +{ + t_usize i; + + i = 0; + while (src[i] && i + 1 < size) + { + dst[i] = src[i]; + i++; + } + if (size > 0) + { + dst[i] = '\0'; + i++; + } + return (ft_strlen(src)); +} diff --git a/libft/ft_strlen.c b/libft/ft_strlen.c new file mode 100644 index 00000000..d8891e40 --- /dev/null +++ b/libft/ft_strlen.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/11/07 16:56:24 by rparodi #+# #+# */ +/* Updated: 2024/04/01 01:37:04 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/minishell.h" + +size_t ft_strlen(t_const_str s) +{ + t_usize i; + + i = 0; + while (s[i] != '\0') + i++; + return (i); +} diff --git a/sources/ft_cmd.c b/sources/ft_cmd.c new file mode 100644 index 00000000..106c56bb --- /dev/null +++ b/sources/ft_cmd.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_cmd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/01 01:00:30 by rparodi #+# #+# */ +/* Updated: 2024/04/01 01:54:23 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/minishell.h" + +void ft_exec_cmd(t_utils *utils, char *cmd, char *cmd_args) +{ + const char **args = (const char **)ft_split(cmd_args, ' '); + + if (execve(cmd, (char *const *)args, (char *const *)utils->envp) == -1) + { + ft_free_strs((char **)args); + ft_exit(utils, 1); + } +} + +void ft_other_cmd(t_utils *shcat, t_usize i) +{ + pid_t pid; + t_i32 options; + + printf("ft_other_cmd = %s", shcat->strs_input[i]); + options = 0; + pid = fork(); + if (pid == -1) + ft_exit(shcat, 1); + if (pid == 0) + ft_exec_cmd(shcat, shcat->strs_input[i], NULL); + waitpid(pid, NULL, options); +} diff --git a/sources/ft_echo.c b/sources/ft_echo.c new file mode 100644 index 00000000..d3daaf6d --- /dev/null +++ b/sources/ft_echo.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_echo.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/03/31 21:48:04 by rparodi #+# #+# */ +/* Updated: 2024/03/31 21:51:41 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/minishell.h" + +void ft_echo(t_str txt, t_str flag) +{ + printf("%s", txt); + if (ft_strcmp(flag, "-n") != 0) + printf("\n"); +} diff --git a/sources/ft_exit.c b/sources/ft_exit.c index 53af92a5..bcc72f93 100644 --- a/sources/ft_exit.c +++ b/sources/ft_exit.c @@ -6,15 +6,41 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/29 11:35:51 by rparodi #+# #+# */ -/* Updated: 2024/03/31 20:54:49 by rparodi ### ########.fr */ +/* Updated: 2024/04/01 01:16:47 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ #include "../includes/minishell.h" -void ft_exit(t_str str, t_u8 exit_status) +void ft_free_strs(t_str *strs) { - free(str); + t_usize i; + + i = 0; + while (strs[i]) + { + free(strs[i]); + i++; + } + free(strs); +} + + t_str str_input; + t_str *strs_input; + +void ft_free_utils(t_utils *s) +{ + if (s->str_input) + free(str_input); + if (s->strs_input) + ft_free_strs(strs_input); + free(s); +} + +void ft_exit(t_utils *maiboyerlpb, t_u8 exit_status) +{ + if (maiboyerlpb) + ft_free_utils(maiboyerlpb); printf("exit\n"); exit(exit_status); } diff --git a/sources/ft_pwd.c b/sources/ft_pwd.c new file mode 100644 index 00000000..8a602d60 --- /dev/null +++ b/sources/ft_pwd.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_pwd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rparodi +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/03/31 22:14:33 by rparodi #+# #+# */ +/* Updated: 2024/03/31 22:27:33 by rparodi ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../includes/minishell.h" + +void ft_pwd(void) +{ + t_str str; + t_usize size; + + size = 1024; + str = (t_str)ft_calloc((size + 1), sizeof(t_i8)); + if (str == NULL) + ft_exit(NULL, 0); + while (getcwd(str, size) == NULL) { + if (str) + free(str); + size *= 2; + str = (t_str)ft_calloc(sizeof(t_i8), size); + if (str == NULL) { + ft_exit(NULL, 0); + } + } + printf("%s\n", str); + free(str); +} diff --git a/sources/main.c b/sources/main.c index 51d773f3..9af5af1d 100644 --- a/sources/main.c +++ b/sources/main.c @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/28 14:40:38 by rparodi #+# #+# */ -/* Updated: 2024/03/31 21:02:40 by rparodi ### ########.fr */ +/* Updated: 2024/04/01 01:51:47 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -50,7 +50,7 @@ t_i32 ft_check_type_operators(t_str *operators) return (1); } -void ft_check(char **input) +void ft_check(t_utils *shcat, char **input) { t_usize i; @@ -60,34 +60,76 @@ void ft_check(char **input) if (ft_check_type_operators(input) == 1) printf("Operateur\n"); else - printf("Commande ou args\n"); + { + if (ft_strcmp(input[i], "exit") == 0) + ft_exit(NULL, 0); + else if (ft_strcmp(input[i], "pwd") == 0) + ft_pwd(); + else + ft_other_cmd(shcat, i); + } i++; } } -void ft_take_args(void) +void ft_take_args(t_utils *shcat) { t_i32 i; t_str user_input = NULL; t_str *args = NULL; i = 0; - while (i < 10000000) + while (1) { - user_input = readline("shcat > "); - if (!user_input || strcmp("exit", user_input) == 0) - ft_exit(user_input, 0); - args = ft_split(user_input, ' '); + shcat->str_input = readline(shcat->name_shell); if (!user_input) + ft_exit(shcat, 0); + shcat->strs_input = ft_split(user_input, ' '); + if (!args) exit(1); - ft_check(args); - add_history(user_input); - free(user_input); + ft_check(shcat, shcat->strs_input); + add_history(shcat->str_input); + ft_free_strs(shcat->strs_input); + free(shcat->str_input); i++; } } -t_i32 main(void) +void ft_init_arge(t_str arge[], t_utils *utils) { - ft_take_args(); + size_t i; + char *temp; + + i = 0; + temp = NULL; + while (arge[i] != NULL) + { + if (arge[i][0] == 'P' && arge[i][1] == 'A' && arge[i][2] == 'T' && \ + arge[i][3] == 'H' && arge[i][4] == '=') + { + temp = ft_strdup(arge[i] + 5); + if (!temp) + ft_exit(utils, 1); + else + utils->path = ft_split(temp, ':'); + break ; + } + i++; + } + if (temp != NULL) + free(temp); +} + +t_i32 main(t_i32 argc, t_str argv[], t_str arge[]) +{ + t_utils *shcat; + + shcat = (t_utils *)malloc(sizeof(t_utils)); + if (argc == 2) + shcat->name_shell = ft_strdup(strcat(argv[1], " > ")); + else + shcat->name_shell = ft_strdup("shcat > "); + ft_init_arge(arge, shcat); + shcat->envp = arge; + ft_take_args(shcat); } diff --git a/test/main.c b/test/main.c new file mode 100644 index 00000000..f518a054 --- /dev/null +++ b/test/main.c @@ -0,0 +1,26 @@ +#include "../includes/minishell.h" + +int main() +{ + char *cwd; + size_t size; + + cwd = (char *)malloc(size); + size = 1024; + if (cwd == NULL) { + perror("malloc"); + exit(EXIT_FAILURE); + } + while (getcwd(cwd, size) == NULL) { + size *= 2; + cwd = (char *)realloc(cwd, size); + if (cwd == NULL) { + perror("realloc"); + exit(EXIT_FAILURE); + } + } + printf("Le répertoire de travail actuel est : %s\n", cwd); + free(cwd); // N'oubliez pas de libérer la mémoire allouée + return 0; +} +