add builtin
This commit is contained in:
parent
d78384b4e9
commit
01d80ba1cd
18
Makefile
18
Makefile
@ -6,7 +6,7 @@
|
|||||||
# By: apommier <apommier@student.42.fr> +#+ +:+ +#+ #
|
# By: apommier <apommier@student.42.fr> +#+ +:+ +#+ #
|
||||||
# +#+#+#+#+#+ +#+ #
|
# +#+#+#+#+#+ +#+ #
|
||||||
# Created: 2022/03/06 12:50:24 by apommier #+# #+# #
|
# Created: 2022/03/06 12:50:24 by apommier #+# #+# #
|
||||||
# Updated: 2022/03/11 16:35:32 by apommier ### ########.fr #
|
# Updated: 2022/04/05 04:11:33 by apommier ### ########.fr #
|
||||||
# #
|
# #
|
||||||
# **************************************************************************** #
|
# **************************************************************************** #
|
||||||
|
|
||||||
@ -17,10 +17,18 @@ SRCS = srcs/main.c\
|
|||||||
srcs/set_cmd/free_cmd.c\
|
srcs/set_cmd/free_cmd.c\
|
||||||
srcs/set_cmd/set_cmd.c\
|
srcs/set_cmd/set_cmd.c\
|
||||||
srcs/set_redirection/redirection.c\
|
srcs/set_redirection/redirection.c\
|
||||||
srcs/set_redirection/utils.c
|
srcs/set_redirection/utils.c\
|
||||||
|
srcs/built_in/unset.c\
|
||||||
|
srcs/built_in/cd.c\
|
||||||
|
srcs/built_in/echo.c\
|
||||||
|
srcs/built_in/export.c\
|
||||||
|
srcs/built_in/utils_builtin.c\
|
||||||
|
srcs/built_in/init_builtin.c\
|
||||||
|
srcs/built_in/export2.c\
|
||||||
|
srcs/built_in/choose_builtin.c
|
||||||
OBJS = ${SRCS:.c=.o}
|
OBJS = ${SRCS:.c=.o}
|
||||||
CC = clang
|
CC = clang
|
||||||
CFLAGS = -Wall -Wextra
|
CFLAGS = -Wall -Wextra -g
|
||||||
LIB = -lreadline
|
LIB = -lreadline
|
||||||
#CFLAGS = -Wall -Wextra -Werror
|
#CFLAGS = -Wall -Wextra -Werror
|
||||||
RM = rm -rf
|
RM = rm -rf
|
||||||
@ -30,7 +38,7 @@ ${NAME}: ${OBJS}
|
|||||||
@make bonus -C ${LIBFT}
|
@make bonus -C ${LIBFT}
|
||||||
@${CC} ${LIB} ${OBJS} ${LIBFT}/libft.a -o ${NAME}
|
@${CC} ${LIB} ${OBJS} ${LIBFT}/libft.a -o ${NAME}
|
||||||
|
|
||||||
all: ${NAME} bonus
|
all: ${NAME}
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@${RM} ${OBJS}
|
@${RM} ${OBJS}
|
||||||
@ -42,6 +50,6 @@ fclean: clean
|
|||||||
|
|
||||||
re: fclean all
|
re: fclean all
|
||||||
|
|
||||||
.PHONY: all clean fclean re bonus
|
.PHONY: all clean fclean re
|
||||||
|
|
||||||
-include ./valgrind.mk
|
-include ./valgrind.mk
|
||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2022/03/09 22:33:49 by apommier #+# #+# */
|
/* Created: 2022/03/09 22:33:49 by apommier #+# #+# */
|
||||||
/* Updated: 2022/04/03 19:22:42 by apommier ### ########.fr */
|
/* Updated: 2022/04/05 18:22:48 by apommier ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -26,11 +26,13 @@
|
|||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
# include <errno.h>
|
# include <errno.h>
|
||||||
# include <signal.h>
|
# include <signal.h>
|
||||||
|
# include <dirent.h>
|
||||||
|
|
||||||
// Command Data Structure
|
// Command Data Structure
|
||||||
|
|
||||||
// Describes a simple command and arguments
|
// Describes a simple command and arguments
|
||||||
typedef struct s_simple {
|
typedef struct s_simple {
|
||||||
|
char **env;
|
||||||
int fd[2];
|
int fd[2];
|
||||||
int pipe[2];
|
int pipe[2];
|
||||||
int last;
|
int last;
|
||||||
@ -85,4 +87,23 @@ int double_size(char **tab);
|
|||||||
void print_double_fd(char **tab, int fd);
|
void print_double_fd(char **tab, int fd);
|
||||||
void free_double(char **tab);
|
void free_double(char **tab);
|
||||||
|
|
||||||
|
//builtins utils
|
||||||
|
void register_env(t_s_cmd *cmd, char *variable);
|
||||||
|
void ft_env(t_s_cmd *cmd, char **env);
|
||||||
|
int find_pwd(t_s_cmd *cmd);
|
||||||
|
void init_s_cmd(t_s_cmd *cmd, char **env);
|
||||||
|
int tab_len(char **tab);
|
||||||
|
int find_len(char *input, int i, char c);
|
||||||
|
//real builtin
|
||||||
|
void ft_env(t_s_cmd *cmd, char **env);
|
||||||
|
void ft_exit(t_s_cmd *cmd);
|
||||||
|
void ft_export(t_s_cmd *cmd);
|
||||||
|
void ft_unset(t_s_cmd *cmd);
|
||||||
|
void ft_echo(t_s_cmd *cmd);
|
||||||
|
void ft_pwd(t_s_cmd *cmd);
|
||||||
|
void open_directory(t_s_cmd *cmd);//cd
|
||||||
|
//parse builtin
|
||||||
|
int is_builtin(char *cmd);
|
||||||
|
void call_builtin(t_cmd *cmd, char **env);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
155
srcs/built_in/cd.c
Normal file
155
srcs/built_in/cd.c
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* cd.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2022/03/21 18:30:26 by sadjigui #+# #+# */
|
||||||
|
/* Updated: 2022/04/05 18:30:30 by apommier ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "../../includes/minishell.h"
|
||||||
|
|
||||||
|
void ft_ls(char *input)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
DIR *dir;
|
||||||
|
struct dirent *sd;
|
||||||
|
|
||||||
|
i = ft_strlen("ls");
|
||||||
|
// if (input[i] == ' ')
|
||||||
|
// {
|
||||||
|
printf("ici\n");
|
||||||
|
while (input[i] && input[i] != ' ')
|
||||||
|
i++;
|
||||||
|
// }
|
||||||
|
// printf("[%c]\n", input[i]);
|
||||||
|
// printf("[%c]\n", input[i+1]);
|
||||||
|
|
||||||
|
dir = opendir(".");
|
||||||
|
if (dir == NULL)
|
||||||
|
{
|
||||||
|
printf("stop\n");
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
// printf("dir --> %s\n", dir[0]);
|
||||||
|
while ((sd=readdir(dir)) != NULL)
|
||||||
|
{
|
||||||
|
printf(" >> %s\n", sd->d_name);
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
void del_one(t_s_cmd *cmd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *r;
|
||||||
|
|
||||||
|
i = ft_strlen(cmd->env[find_pwd(cmd)]);
|
||||||
|
// printf("%s\n", cmd->args[6]);
|
||||||
|
// while (cmd->env[find_pwd(cmd)][i])
|
||||||
|
// i++;
|
||||||
|
while (cmd->env[find_pwd(cmd)][i] != '/')
|
||||||
|
i--;
|
||||||
|
r = ft_substr(cmd->env[find_pwd(cmd)], 0, i);
|
||||||
|
free(cmd->env[find_pwd(cmd)]);
|
||||||
|
cmd->env[find_pwd(cmd)] = ft_strdup(r);
|
||||||
|
free(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_one(t_s_cmd *cmd, char *str)
|
||||||
|
{
|
||||||
|
char *r;
|
||||||
|
|
||||||
|
r = ft_strjoin(cmd->env[find_pwd(cmd)], "/");
|
||||||
|
r = ft_strjoin(r, str);
|
||||||
|
//free(cmd->env[find_pwd(cmd)]);
|
||||||
|
cmd->env[find_pwd(cmd)] = ft_strdup(r);
|
||||||
|
free(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
void change_path(t_s_cmd *cmd)
|
||||||
|
{
|
||||||
|
char **tab;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
tab = ft_split(cmd->args[1], '/');
|
||||||
|
while (cmd->env[i])
|
||||||
|
{
|
||||||
|
if (ft_strncmp(cmd->env[i], "OLDPWD=", 7) == 0)
|
||||||
|
break ;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
printf("%d\n", i);
|
||||||
|
/*if (cmd->env[i])
|
||||||
|
free(cmd->env[i]);*/
|
||||||
|
cmd->env[i] = ft_strjoin("OLD", cmd->env[find_pwd(cmd)]);
|
||||||
|
i = 0;
|
||||||
|
while (tab[i])
|
||||||
|
{
|
||||||
|
if (ft_strcmp(tab[i], "..") == 0)
|
||||||
|
del_one(cmd);
|
||||||
|
else
|
||||||
|
add_one(cmd, tab[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void reboot_pwd(t_s_cmd *cmd, int i)
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
|
||||||
|
while (i > 3)
|
||||||
|
{
|
||||||
|
if (chdir("..") == 0)
|
||||||
|
del_one(cmd);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
str = ft_substr(cmd->args[1], 2, ft_strlen(cmd->args[1]));
|
||||||
|
cmd->args[1] = ft_strdup(str);
|
||||||
|
free(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void open_directory(t_s_cmd *cmd)
|
||||||
|
{
|
||||||
|
char **str;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
str = ft_split(cmd->env[find_pwd(cmd)], '/');
|
||||||
|
j = tab_len(str);
|
||||||
|
if (!cmd->args[1])
|
||||||
|
{
|
||||||
|
while (j-- > 3)
|
||||||
|
if (chdir("..") == 0)
|
||||||
|
del_one(cmd);
|
||||||
|
}
|
||||||
|
if (tab_len(cmd->args) == 2)
|
||||||
|
{
|
||||||
|
if (cmd->args[1][0] == '~')
|
||||||
|
reboot_pwd(cmd, j);
|
||||||
|
if (chdir(cmd->args[1]) == 0)
|
||||||
|
change_path(cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_pwd(t_s_cmd *cmd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
i = 0;
|
||||||
|
while (cmd->env[find_pwd(cmd)][j] != '=')
|
||||||
|
j++;
|
||||||
|
j += 1;
|
||||||
|
while (cmd->env[find_pwd(cmd)][j])
|
||||||
|
{
|
||||||
|
write (1, &cmd->env[find_pwd(cmd)][j], 1);
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
write(1, "\n", 1);
|
||||||
|
}
|
||||||
46
srcs/built_in/choose_builtin.c
Normal file
46
srcs/built_in/choose_builtin.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* choose_builtin.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2022/02/28 17:12:52 by sadjigui #+# #+# */
|
||||||
|
/* Updated: 2022/04/05 18:22:08 by apommier ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "../../includes/minishell.h"
|
||||||
|
|
||||||
|
int is_builtin(char *cmd)
|
||||||
|
{
|
||||||
|
if (!ft_strcmp(cmd, "env"))
|
||||||
|
return (1);
|
||||||
|
if (!ft_strcmp(cmd, "export"))
|
||||||
|
return (1);
|
||||||
|
if (!ft_strcmp(cmd, "unset"))
|
||||||
|
return (1);
|
||||||
|
if (!ft_strcmp(cmd, "echo"))
|
||||||
|
return (1);
|
||||||
|
if (!ft_strcmp(cmd, "cd"))
|
||||||
|
return (1);
|
||||||
|
if (!ft_strcmp(cmd, "pwd"))
|
||||||
|
return (1);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void call_builtin(t_cmd *cmd, char **env)
|
||||||
|
{
|
||||||
|
if (!ft_strcmp(cmd->current_s_cmd->cmd, "env"))
|
||||||
|
print_double_fd(env, 0);
|
||||||
|
if (!ft_strcmp(cmd->current_s_cmd->cmd, "export"))
|
||||||
|
ft_export(cmd->current_s_cmd);
|
||||||
|
if (!ft_strcmp(cmd->current_s_cmd->cmd, "unset"))
|
||||||
|
ft_unset(cmd->current_s_cmd);
|
||||||
|
if (!ft_strcmp(cmd->current_s_cmd->cmd, "echo"))
|
||||||
|
ft_echo(cmd->current_s_cmd);
|
||||||
|
if (!ft_strcmp(cmd->current_s_cmd->cmd, "cd"))
|
||||||
|
open_directory(cmd->current_s_cmd);
|
||||||
|
if (!ft_strcmp(cmd->current_s_cmd->cmd, "pwd"))
|
||||||
|
ft_pwd(cmd->current_s_cmd);
|
||||||
|
}
|
||||||
163
srcs/built_in/echo.c
Normal file
163
srcs/built_in/echo.c
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* echo.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2022/03/11 20:52:56 by sadjigui #+# #+# */
|
||||||
|
/* Updated: 2022/04/05 17:30:24 by apommier ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "../../includes/minishell.h"
|
||||||
|
|
||||||
|
int jump_space(char *str, int i)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
|
j = i;
|
||||||
|
while (str[j] == ' ')
|
||||||
|
j++;
|
||||||
|
return (j);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_value(char *str, char *input)
|
||||||
|
{
|
||||||
|
(void)input;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (str[i] && str[i] != '=')
|
||||||
|
i++;
|
||||||
|
i++;
|
||||||
|
ft_putstr_fd(str + i, 0);
|
||||||
|
/*while (str[i])
|
||||||
|
{
|
||||||
|
ft_putchar(str[i]);
|
||||||
|
i++;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
// void print_rest(char *input, char *str, int j)
|
||||||
|
// {
|
||||||
|
// int i;
|
||||||
|
//
|
||||||
|
// i = 0;
|
||||||
|
// j -= 1;
|
||||||
|
// while (input[j++])
|
||||||
|
// printf("%c", input[j]);
|
||||||
|
// printf("\n");
|
||||||
|
// while (input[j] && input[j] == str[i])
|
||||||
|
// {
|
||||||
|
// i++;
|
||||||
|
// j++;
|
||||||
|
// }
|
||||||
|
// printf("str == %s\n", str);
|
||||||
|
// if (input[j] != '\0')
|
||||||
|
// {
|
||||||
|
// j = jump_space(input, j);
|
||||||
|
// if (input[j] != '\0')
|
||||||
|
// while(input[j])
|
||||||
|
// {
|
||||||
|
// ft_putchar(input[j]);
|
||||||
|
// j++;
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// return ;
|
||||||
|
// }
|
||||||
|
|
||||||
|
void find_for_print(t_s_cmd *cmd, char *input)
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
// char *tmp;
|
||||||
|
int i;
|
||||||
|
int x;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
// j = j + 1;
|
||||||
|
// tmp = ft_substr(input, j, find_len(input, j, 32));
|
||||||
|
// printf("%c\n", input[j]);
|
||||||
|
str = ft_strjoin(input, "=");
|
||||||
|
x = ft_strlen(str);
|
||||||
|
// printf("%d\n", x);
|
||||||
|
while (cmd->env[i])
|
||||||
|
{
|
||||||
|
if (ft_strncmp(cmd->env[i], str, x) == 0)
|
||||||
|
{
|
||||||
|
// printf("%s\n", cmd->env[i]);
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (cmd->env[i] != NULL)
|
||||||
|
{
|
||||||
|
print_value(cmd->env[i], input);
|
||||||
|
// print_rest(input, tmp, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int dollar_or_not(char *str)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (str[i])
|
||||||
|
{
|
||||||
|
if (str[i] == '$')
|
||||||
|
return (1);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void find_value(t_s_cmd *cmd, char *str)
|
||||||
|
{
|
||||||
|
// int i;
|
||||||
|
//
|
||||||
|
// i = 0;
|
||||||
|
while (*str)
|
||||||
|
{
|
||||||
|
if (*str == '$')
|
||||||
|
break ;
|
||||||
|
printf("%c", *str);
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
str++;
|
||||||
|
find_for_print(cmd, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_echo(t_s_cmd *d)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
int is_option;
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
i = 1;
|
||||||
|
is_option = 0;
|
||||||
|
if (d->args[i] && ft_strcmp(d->args[i], "-n") == 0)
|
||||||
|
{
|
||||||
|
is_option = 1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (d->args[i])
|
||||||
|
while (d->args[i])
|
||||||
|
{
|
||||||
|
if (dollar_or_not(d->args[i]) == 1)
|
||||||
|
find_value(d, d->args[i]);
|
||||||
|
else
|
||||||
|
printf("%s", d->args[i]);
|
||||||
|
if (d->args[i + 1] != NULL)
|
||||||
|
printf("\n");
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
// else
|
||||||
|
// my_putstr(input, i);
|
||||||
|
if (is_option == 0)
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
112
srcs/built_in/export.c
Normal file
112
srcs/built_in/export.c
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* export.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2022/02/28 23:26:59 by sadjigui #+# #+# */
|
||||||
|
/* Updated: 2022/04/05 03:54:10 by apommier ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "../../includes/minishell.h"
|
||||||
|
|
||||||
|
int check_variable(char *variable)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
if (!ft_isalpha(variable[i]))
|
||||||
|
return(0);
|
||||||
|
i++;
|
||||||
|
while(variable[i] != '=')
|
||||||
|
{
|
||||||
|
if(!ft_isalnum(variable[i]))
|
||||||
|
return(0);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// char *define_double_quotes(char *value)
|
||||||
|
// {
|
||||||
|
// int i;
|
||||||
|
// char *dest;
|
||||||
|
//
|
||||||
|
// i = find_len(value, 0, '=') + 2;
|
||||||
|
// if (value[i] == '"')
|
||||||
|
// dest = ft_substr()
|
||||||
|
// }
|
||||||
|
|
||||||
|
char *check_value(char *value)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *dest;
|
||||||
|
|
||||||
|
i = find_len(value, 0, '=') + 1;
|
||||||
|
if (value[i] == '"')
|
||||||
|
{
|
||||||
|
printf("wait\n");
|
||||||
|
dest = ft_strdup(" ");
|
||||||
|
// dest = define_double_quotes(value);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
dest = ft_substr(value, 0, find_len(value, 0, ' '));
|
||||||
|
// printf("brrrrrrr------\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
return (dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_export_variable(t_s_cmd *cmd, char *variable)
|
||||||
|
{
|
||||||
|
char *dest;
|
||||||
|
char *unset;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
if (check_variable(variable) == 0)
|
||||||
|
{
|
||||||
|
printf("Voir bash\n");
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
// printf("jojo\n");
|
||||||
|
dest = check_value(variable);
|
||||||
|
unset = ft_substr(dest, 0, find_len(dest, 0, '='));
|
||||||
|
while (cmd->env[i] != NULL)
|
||||||
|
{
|
||||||
|
if (ft_strncmp(unset, cmd->env[i], ft_strlen(unset)) == 0)
|
||||||
|
{
|
||||||
|
find_variable(unset, cmd);
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
register_env(cmd, dest);
|
||||||
|
if (dest)
|
||||||
|
free(dest);
|
||||||
|
// if (unset)
|
||||||
|
// free(unset);
|
||||||
|
// if (check_variable(v_v[0]) == 1)
|
||||||
|
// {
|
||||||
|
// tmp = ft_strdup(v_v[1]);
|
||||||
|
// free(v_v[1]);
|
||||||
|
// v_v[1] = check_value(tmp);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_export(t_s_cmd *cmd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 1;
|
||||||
|
if (!cmd->args[i])
|
||||||
|
lone_export(cmd);
|
||||||
|
else if (cmd->args[i])
|
||||||
|
while (cmd->args[i])
|
||||||
|
{
|
||||||
|
ft_export_variable(cmd, cmd->args[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
77
srcs/built_in/export2.c
Normal file
77
srcs/built_in/export2.c
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* export2.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2022/03/07 17:58:25 by sadjigui #+# #+# */
|
||||||
|
/* Updated: 2022/04/05 03:47:53 by apommier ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "../../includes/minishell.h"
|
||||||
|
|
||||||
|
void ft_swap(char **a, char **b)
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
|
||||||
|
tmp = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sort_tab(char **av)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int x;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
// if (ac > 1)
|
||||||
|
// {
|
||||||
|
while (av[i])
|
||||||
|
{
|
||||||
|
x = i;
|
||||||
|
while (av[x])
|
||||||
|
{
|
||||||
|
if (ft_strcmp(av[i], av[x]) > 0)
|
||||||
|
ft_swap(&av[i], &av[x]);
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
// }
|
||||||
|
// return (av);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_export(char *tmp)
|
||||||
|
{
|
||||||
|
char *str1;
|
||||||
|
char *str2;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
str1 = ft_substr(tmp, 0, find_len(tmp, i, '='));
|
||||||
|
i = find_len(tmp, 0, '=') + 1;
|
||||||
|
str2 = ft_substr(tmp, i, find_len(tmp, i, '\0'));
|
||||||
|
printf("declare -x %s=\"%s\"\n", str1, str2);
|
||||||
|
free(str1);
|
||||||
|
free(str2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void lone_export(t_s_cmd *cmd)
|
||||||
|
{
|
||||||
|
char **tmp;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
tmp = cmd->env;
|
||||||
|
sort_tab(tmp);
|
||||||
|
while (tmp[i])
|
||||||
|
{
|
||||||
|
print_export(tmp[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
134
srcs/built_in/init_builtin.c
Normal file
134
srcs/built_in/init_builtin.c
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* init_builtin.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2022/02/28 17:17:01 by sadjigui #+# #+# */
|
||||||
|
/* Updated: 2022/04/05 17:16:17 by apommier ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "../../includes/minishell.h"
|
||||||
|
|
||||||
|
// void join_variable(t_s_cmd *cmd, char **v_v, int size, char **tab)
|
||||||
|
// {
|
||||||
|
// char *str;
|
||||||
|
// char *tmp;
|
||||||
|
//
|
||||||
|
// while (tab[size])
|
||||||
|
// {
|
||||||
|
// cmd->env[size] = ft_strdup(tab[size]);
|
||||||
|
// // printf("tmp----%s\n", tmp[size]);
|
||||||
|
// // printf("envy---%s\n", cmd->env[size]);
|
||||||
|
// size++;
|
||||||
|
// }
|
||||||
|
// str = ft_strjoin(v_v[0], "=");
|
||||||
|
// tmp = ft_strdup(str);
|
||||||
|
// free(str);
|
||||||
|
// str = ft_strjoin(tmp,v_v[1]);
|
||||||
|
// cmd->env[size] = ft_strdup(str);
|
||||||
|
// printf("ici\n");
|
||||||
|
// free(str);
|
||||||
|
// free(tmp);
|
||||||
|
// cmd->env[size + 1] = NULL;
|
||||||
|
// }
|
||||||
|
|
||||||
|
void register_env(t_s_cmd *cmd, char *variable)
|
||||||
|
{
|
||||||
|
char **tmp = NULL;
|
||||||
|
int i;
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
// tmp = NULL;
|
||||||
|
// printf("TABLEN %d", tab_len(cmd->env));
|
||||||
|
tmp = (char **)malloc(sizeof(char *) * (tab_len(cmd->env) + 2));
|
||||||
|
if(!tmp)
|
||||||
|
printf("no tmp\n");
|
||||||
|
while (cmd->env[i])
|
||||||
|
{
|
||||||
|
tmp[i] = ft_strdup(cmd->env[i]);
|
||||||
|
// printf("ici\n");
|
||||||
|
// printf("%s\n", "let me in");
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
// printf("i: %d %s\n",i,tmp[i]);
|
||||||
|
// printf("%s\n", "brrrrrrr");
|
||||||
|
tmp[i] = ft_strdup(variable);
|
||||||
|
tmp[i + 1] = NULL;
|
||||||
|
// printf("debut %p\n", tmp[2]);
|
||||||
|
// printf("1--------------------\n");
|
||||||
|
free_double(cmd->env);
|
||||||
|
// printf("1--------------------\n");
|
||||||
|
cmd->env = (char **)malloc(sizeof(char *) * (tab_len(tmp) + 1));
|
||||||
|
if (!cmd->env)
|
||||||
|
printf("no env\n");
|
||||||
|
i = 0;
|
||||||
|
while (tmp[i])
|
||||||
|
{
|
||||||
|
cmd->env[i] = ft_strdup(tmp[i]);
|
||||||
|
// if (tmp[size])
|
||||||
|
// free(tmp[size]);
|
||||||
|
// printf("tmp----%s\n", tmp[size]);
|
||||||
|
// printf("envy---%s\n", cmd->env[size]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
cmd->env[i] = NULL;
|
||||||
|
// printf("2--------------------\n");
|
||||||
|
if (tmp)
|
||||||
|
free_double(tmp);
|
||||||
|
// printf("2--------------------\n");
|
||||||
|
// int i = 0;
|
||||||
|
// while (tmp[i])
|
||||||
|
// {
|
||||||
|
// printf("nano");
|
||||||
|
// free(tmp[i]);
|
||||||
|
// i++;
|
||||||
|
// }
|
||||||
|
// if(tmp)
|
||||||
|
// free(tmp);
|
||||||
|
// join_variable(cmd, variable, size, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_env(t_s_cmd *cmd, char **env)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (env[i])
|
||||||
|
i++;
|
||||||
|
cmd->env = ft_calloc(sizeof(char *), i + 1);
|
||||||
|
i = 0;
|
||||||
|
while (env[i])
|
||||||
|
{
|
||||||
|
cmd->env[i] = ft_strdup(env[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
cmd->env[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int find_pwd(t_s_cmd *cmd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (cmd->env[i] && ft_strncmp(cmd->env[i], "PWD=", 4) != 0)
|
||||||
|
i++;
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_s_cmd(t_s_cmd *cmd, char **env)
|
||||||
|
{
|
||||||
|
ft_env(cmd, env);
|
||||||
|
}
|
||||||
|
|
||||||
|
int tab_len(char **tab)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (tab[i])
|
||||||
|
i++;
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
90
srcs/built_in/unset.c
Normal file
90
srcs/built_in/unset.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* unset.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2022/03/11 18:26:29 by sadjigui #+# #+# */
|
||||||
|
/* Updated: 2022/04/05 03:54:57 by apommier ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "../../includes/minishell.h"
|
||||||
|
|
||||||
|
void unset_variable(t_s_cmd *cmd, int i)
|
||||||
|
{
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
char **tmp;
|
||||||
|
|
||||||
|
a = 0;
|
||||||
|
b = 0;
|
||||||
|
tmp = malloc(sizeof(char *) * tab_len(cmd->env));
|
||||||
|
if (!tmp)
|
||||||
|
printf("no tmp\n");
|
||||||
|
//ft_exit(cmd);
|
||||||
|
while (cmd->env[a])
|
||||||
|
{
|
||||||
|
// if (a == i)
|
||||||
|
// a++;
|
||||||
|
printf("%s\n", cmd->env[a]);
|
||||||
|
if (a != i)
|
||||||
|
{
|
||||||
|
tmp[b] = ft_substr(cmd->env[a], 0, ft_strlen(cmd->env[a]));
|
||||||
|
b++;
|
||||||
|
}
|
||||||
|
a++;
|
||||||
|
}
|
||||||
|
tmp[b] = NULL;
|
||||||
|
free_double(cmd->env);
|
||||||
|
a = 0;
|
||||||
|
cmd->env = malloc(sizeof(char *) * (tab_len(tmp) + 1));
|
||||||
|
if (!cmd->env)
|
||||||
|
printf("no env\n");
|
||||||
|
//ft_exit(cmd);
|
||||||
|
while (tmp[a])
|
||||||
|
{
|
||||||
|
cmd->env[a] = ft_strdup(tmp[a]);
|
||||||
|
// printf("%s\n", cmd->env[a]);
|
||||||
|
a++;
|
||||||
|
}
|
||||||
|
cmd->env[a] = NULL;
|
||||||
|
if (tmp)
|
||||||
|
free_double(tmp);
|
||||||
|
printf("2-------------\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void find_variable(char *variable, t_s_cmd *cmd)
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
str = ft_strjoin(variable, "=");
|
||||||
|
j = 0;
|
||||||
|
// printf("variable == %s\n", variable);
|
||||||
|
while (str[j])
|
||||||
|
j++;
|
||||||
|
while (cmd->env[i] && !(ft_strncmp(cmd->env[i], str, j) == 0))
|
||||||
|
i++;
|
||||||
|
if (i == tab_len(cmd->env))
|
||||||
|
return ;
|
||||||
|
unset_variable(cmd, i);
|
||||||
|
free(str);
|
||||||
|
printf("%s\n", "3----------------");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_unset(t_s_cmd *cmd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 1;
|
||||||
|
while (cmd->args[i])
|
||||||
|
{
|
||||||
|
find_variable(cmd->args[i], cmd);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
23
srcs/built_in/utils_builtin.c
Normal file
23
srcs/built_in/utils_builtin.c
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* utils_builtin.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2022/03/16 15:04:12 by sadjigui #+# #+# */
|
||||||
|
/* Updated: 2022/04/05 03:47:53 by apommier ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "../../includes/minishell.h"
|
||||||
|
|
||||||
|
int find_len(char *input, int i, char c)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
|
j = i;
|
||||||
|
while (input[j] && input[j] != c)
|
||||||
|
j++;
|
||||||
|
return (j);
|
||||||
|
}
|
||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2022/04/02 18:51:31 by apommier #+# #+# */
|
/* Created: 2022/04/02 18:51:31 by apommier #+# #+# */
|
||||||
/* Updated: 2022/04/02 18:51:32 by apommier ### ########.fr */
|
/* Updated: 2022/04/05 18:26:19 by apommier ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -58,6 +58,11 @@ int wait_exit(t_cmd *cmd)
|
|||||||
|
|
||||||
void exec_cmd(t_cmd *cmd, char **env, int *fdpipe)
|
void exec_cmd(t_cmd *cmd, char **env, int *fdpipe)
|
||||||
{
|
{
|
||||||
|
if (is_builtin(cmd->current_s_cmd->cmd))
|
||||||
|
{
|
||||||
|
call_builtin(cmd, env);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
cmd->current_s_cmd->child = fork();
|
cmd->current_s_cmd->child = fork();
|
||||||
if (cmd->current_s_cmd->child == 0)
|
if (cmd->current_s_cmd->child == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2022/03/08 15:19:42 by apommier #+# #+# */
|
/* Created: 2022/03/08 15:19:42 by apommier #+# #+# */
|
||||||
/* Updated: 2022/04/03 18:19:55 by apommier ### ########.fr */
|
/* Updated: 2022/04/05 18:23:49 by apommier ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -31,22 +31,28 @@ t_s_cmd *set_s_cmd(char *line, t_cmd *cmd, int index)
|
|||||||
//printf("before redirect\n");
|
//printf("before redirect\n");
|
||||||
line = set_redirection(s_cmd, line, index);//SET REDIRECTION
|
line = set_redirection(s_cmd, line, index);//SET REDIRECTION
|
||||||
split_line = ft_split(line, ' ');
|
split_line = ft_split(line, ' ');
|
||||||
s_cmd->cmd = get_command(split_line, cmd->path);
|
print_double_fd(split_line, 0);
|
||||||
if (!s_cmd->cmd)
|
if (!is_builtin(split_line[0]))
|
||||||
|
s_cmd->cmd = get_command(split_line, cmd->path);
|
||||||
|
else
|
||||||
|
s_cmd->cmd = ft_strjoin(split_line[0], 0);
|
||||||
|
/*if (!s_cmd->cmd)
|
||||||
{
|
{
|
||||||
free(line);
|
free(line);
|
||||||
free_double(split_line);
|
free_double(split_line);
|
||||||
free(s_cmd);
|
free(s_cmd);
|
||||||
return (0);
|
return (0);
|
||||||
|
}*/
|
||||||
|
if (s_cmd->cmd)
|
||||||
|
{
|
||||||
|
s_cmd->nb_args = double_size(split_line);
|
||||||
|
s_cmd->args = split_line;
|
||||||
}
|
}
|
||||||
s_cmd->nb_args = double_size(split_line);
|
|
||||||
//set_redirection(s_cmd);
|
|
||||||
s_cmd->args = split_line;
|
|
||||||
free(line);
|
free(line);
|
||||||
return (s_cmd);
|
return (s_cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
t_cmd *split_cmd(t_cmd *cmd, char **cmds)
|
t_cmd *split_cmd(t_cmd *cmd, char **cmds, char **env)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -60,6 +66,7 @@ t_cmd *split_cmd(t_cmd *cmd, char **cmds)
|
|||||||
free_cmd(cmd);
|
free_cmd(cmd);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
cmd->s_cmds[i]->env = env;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
cmd->s_cmds[i] = 0;
|
cmd->s_cmds[i] = 0;
|
||||||
@ -85,7 +92,7 @@ t_cmd *set_cmd(char *input, char **env)
|
|||||||
cmd->outfile = 0;
|
cmd->outfile = 0;
|
||||||
cmd->infile = 0;
|
cmd->infile = 0;
|
||||||
cmd->nb_s_cmd = double_size(cmds);
|
cmd->nb_s_cmd = double_size(cmds);
|
||||||
cmd = split_cmd(cmd, cmds); //split each cmd into args in s_cmd
|
cmd = split_cmd(cmd, cmds, env); //split each cmd into args in s_cmd
|
||||||
free(cmds);
|
free(cmds);
|
||||||
if (cmd)
|
if (cmd)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user