aboutsummaryrefslogtreecommitdiff
path: root/src/interpreter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interpreter.c')
-rw-r--r--src/interpreter.c473
1 files changed, 58 insertions, 415 deletions
diff --git a/src/interpreter.c b/src/interpreter.c
index 33d945c..af1eb82 100644
--- a/src/interpreter.c
+++ b/src/interpreter.c
@@ -6,326 +6,73 @@
/* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/12/17 19:15:49 by chuhlig #+# #+# */
-/* Updated: 2025/01/11 12:52:57 by chuhlig ### ########.fr */
+/* Updated: 2025/01/14 16:59:45 by chuhlig ### ########.fr */
/* */
/* ************************************************************************** */
#include "debug_tools.h"
#include "minishell.h"
-#include <stdlib.h>
-#include <sys/_types/_pid_t.h>
-#include <sys/cdefs.h>
-#include <sys/wait.h>
-#include <unistd.h>
-#include <sys/fcntl.h>
-#include <sys/types.h>
-
-// static int eval_rec(t_node *node, t_env **env, int in_fd);
-
-// int eval(t_node *node, t_env **env)
-// {
-// pid_t pid;
-// int result;
-
-// if (node == NULL)
-// return (EXIT_FAILURE);
-// result = 0;
-// pid = fork();
-// if (pid < 0)
-// {
-// return (EXIT_FAILURE);
-// }
-// if (pid == 0)
-// {
-// result = eval_rec(node, env, STDIN_FILENO);
-// exit(result);
-// }
-// else
-// {
-// waitpid(pid, &result, 0);
-// }
-// return (result);
-// }
-
-// static int eval_rec(t_node *node, t_env **env, int in_fd)
-// {
-// pid_t pid;
-// int result;
-// int p[2];
-
-// result = pipe(p);
-// if (result == -1)
-// return (EXIT_FAILURE);
-// if (node->type == PIPE_NODE)
-// {
-// pid = fork();
-// if (pid < 0)
-// {
-// return (EXIT_FAILURE);
-// }
-// if (pid == 0)
-// {
-// close(p[0]);
-// dup2(in_fd, STDIN_FILENO);
-// dup2(p[1], STDOUT_FILENO);
-// result = execute_cmd(&node->content.pipe.left->content.cmd, env);
-// exit(result);
-// }
-// else
-// {
-// close(p[1]);
-// dup2(p[0], STDIN_FILENO);
-// result = eval_rec(node->content.pipe.right, env, p[0]);
-// }
-// }
-// else if (node->type == CMD_NODE)
-// {
-// result = execute_cmd(&node->content.cmd, env);
-// }
-// else
-// {
-// panic(UNREACHABLE);
-// return (EXIT_FAILURE);
-// }
-// return (result);
-// }
-
-
-//old interpreter
-// #include "minishell.h"
-// #include <stdio.h>
-
-// static int eval_pipe(t_pipe *pipe, t_env *env);
-// static int eval_cmd(t_cmd *cmd, t_env **env);
-
-// int eval(t_node *node, t_env **env)
-// {
-// if (node->type == PIPE_NODE)
-// return (eval_pipe(&node->content.pipe, *env));
-// else if (node->type == CMD_NODE)
-// return (eval_cmd(&node->content.cmd, env));
-// else
-// {
-// panic(UNREACHABLE);
-// return (-1);
-// }
-// }
-
-// static int eval_pipe(t_pipe *pipe, t_env *env)
-// {
-// dbg("TODO: PIPE");
-// eval_cmd(&pipe->left->content.cmd, &env);
-// eval_cmd(&pipe->right->content.cmd, &env);
-// return (0);
-// }
-
-// static int eval_cmd(t_cmd *cmd, t_env **env)
-// {
-// if (ft_strncmp(cmd->args[0], "pwd", 4) == 0)
-// pwd(*env);
-// else if (ft_strncmp(cmd->args[0], "echo", 5) == 0)
-// echo(cmd->args);
-// else if (ft_strncmp(cmd->args[0], "env", 4) == 0)
-// ft_env(*env);
-// else if (ft_strncmp(cmd->args[0], "cd", 3) == 0)
-// cd(env, cmd->args);
-// else if (ft_strncmp(cmd->args[0], "unset", 6) == 0)
-// unset(cmd->args, env);
-// else if (ft_strncmp(cmd->args[0], "export", 7) == 0)
-// export(cmd->args, env);
-// return (0);
-// }
-
-//v2.0
-
-int is_builtin(char *cmd)
+int handle_redirections(t_redirection *redirs)
{
- return ((ft_strcmp(cmd, "export") == 0)
- || (ft_strcmp(cmd, "unset") == 0)
- || (ft_strcmp(cmd, "cd") == 0)
- || (ft_strcmp(cmd, "exit") == 0)
- || (ft_strcmp(cmd, "echo") == 0)
- || (ft_strcmp(cmd, "pwd") == 0)
- || (ft_strcmp(cmd, "env") == 0));
-}
+ int fd;
-int execute_builtin(char **args, t_env **env)
-{
- if (ft_strcmp(args[0], "export") == 0)
- return (export(args, env));
- else if (ft_strcmp(args[0], "unset") == 0)
- return (unset(args, env));
- else if (ft_strcmp(args[0], "cd") == 0)
- return (cd(env, args));
- else if (ft_strcmp(args[0], "exit") == 0)
- return (EXIT_SUCCESS);
- else if (ft_strcmp(args[0], "echo") == 0)
- return (echo(args));
- else if (ft_strcmp(args[0], "pwd") == 0)
- return (pwd(*env));
- else if (ft_strcmp(args[0], "env") == 0)
- return (ft_env(*env));
- return (1);
-}
-// v1.0
-
-// static int handle_redirections(t_redirection *redirs)
-// {
-// int fd;
-// int pipe_fds[2];
-
-// if (redirs[0].type == INPUT_LIMITER)
-// {
-// if (pipe(pipe_fds) == -1)
-// {
-// perror("pipe");
-// return (-1);
-// }
-// write(pipe_fds[1], redirs[0].specifier, strlen(redirs[0].specifier));
-// close(pipe_fds[1]);
-// dup2(pipe_fds[0], STDIN_FILENO);
-// close(pipe_fds[0]);
-// }
-// else if (redirs[0].type == INPUT_FILE)
-// {
-// fd = open(redirs[0].specifier, O_RDONLY);
-// if (fd == -1)
-// {
-// perror(redirs[0].specifier);
-// return (-1);
-// }
-// dup2(fd, STDIN_FILENO);
-// close(fd);
-// }
-// if (redirs[1].type == OUTPUT_OVERRIDE)
-// {
-// fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644);
-// if (fd == -1)
-// {
-// perror(redirs[1].specifier);
-// return (-1);
-// }
-// dup2(fd, STDOUT_FILENO);
-// close(fd);
-// }
-// else if (redirs[1].type == OUTPUT_APPEND)
-// {
-// fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644);
-// if (fd == -1)
-// {
-// perror(redirs[1].specifier);
-// return (-1);
-// }
-// dup2(fd, STDOUT_FILENO);
-// close(fd);
-// }
-// return (0);
-// }
-//v 3.0
-static int handle_redirections(t_redirection *redirs)
-{
- int fd;
-
- if (redirs[0].type == INPUT_FILE)
- {
- fd = open(redirs[0].specifier, O_RDONLY);
- if (fd < 0)
- {
- perror("open");
- return (-1);
- }
- dup2(fd, STDIN_FILENO);
- close(fd);
- }
- else if (redirs[0].type == INPUT_LIMITER)
- {
- // Handle here document (<<)
- // Assuming heredoc_data is stored in redirs[0].specifier
- fd = open("/tmp/heredoc_tmp", O_WRONLY | O_CREAT | O_TRUNC, 0644);
- if (fd < 0)
- {
- perror("open");
- return (-1);
- }
- write(fd, redirs[0].specifier, strlen(redirs[0].specifier));
- close(fd);
- fd = open("/tmp/heredoc_tmp", O_RDONLY);
- if (fd < 0)
- {
- perror("open");
- return (-1);
- }
- dup2(fd, STDIN_FILENO);
- close(fd);
- }
- if (redirs[1].type == OUTPUT_OVERRIDE)
- {
- fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644);
- if (fd < 0)
- {
- perror("open");
- return (-1);
- }
- dup2(fd, STDOUT_FILENO);
- close(fd);
- }
- else if (redirs[1].type == OUTPUT_APPEND)
- {
- fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644);
- if (fd < 0)
- {
- perror("open");
- return (-1);
- }
- dup2(fd, STDOUT_FILENO);
- close(fd);
- }
- return (0);
+ if (redirs[0].type == INPUT_FILE)
+ {
+ fd = open(redirs[0].specifier, O_RDONLY);
+ if (fd < 0)
+ {
+ perror(redirs[0].specifier);
+ return (-1);
+ }
+ dup2(fd, STDIN_FILENO);
+ close(fd);
+ }
+ else if (redirs[0].type == INPUT_LIMITER)
+ {
+ fd = open("/tmp/heredoc_tmp", O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ if (fd < 0)
+ {
+ perror("open");
+ return (-1);
+ }
+ write(fd, redirs[0].specifier, ft_strlen(redirs[0].specifier));
+ close(fd);
+ fd = open("/tmp/heredoc_tmp", O_RDONLY);
+ if (fd < 0)
+ {
+ perror("open");
+ return (-1);
+ }
+ dup2(fd, STDIN_FILENO);
+ close(fd);
+ }
+ if (redirs[1].type == OUTPUT_OVERRIDE)
+ {
+ fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ if (fd < 0)
+ {
+ perror("open");
+ return (-1);
+ }
+ dup2(fd, STDOUT_FILENO);
+ close(fd);
+ }
+ else if (redirs[1].type == OUTPUT_APPEND)
+ {
+ fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644);
+ if (fd < 0)
+ {
+ perror("open");
+ return (-1);
+ }
+ dup2(fd, STDOUT_FILENO);
+ close(fd);
+ }
+ return (0);
}
-//v 2.0
-// static int eval_rec(t_node *node, t_env **env, int in_fd)
-// {
-// pid_t pid;
-// int p[2];
-// int result;
-// int status;
-
-// if (node->type == PIPE_NODE)
-// {
-// pipe(p);
-// pid = fork();
-// if (pid == 0)
-// {
-// close(p[0]);
-// dup2(in_fd, STDIN_FILENO);
-// dup2(p[1], STDOUT_FILENO);
-// result = eval_rec(node->content.pipe.left, env, in_fd);
-// exit(result);
-// }
-// else
-// {
-// close(p[1]);
-// dup2(p[0], STDIN_FILENO);
-// result = eval_rec(node->content.pipe.right, env, p[0]);
-// waitpid(pid, &status, 0);
-// }
-// }
-// else if (node->type == CMD_NODE)
-// {
-// result = execute_cmd(&node->content.cmd, env);
-// }
-// else
-// {
-// panic("UNREACHABLE");
-// result = EXIT_FAILURE;
-// }
-// return (result);
-// }
-
-//v 3.0
-static int eval_rec(t_node *node, t_env **env, int in_fd)
+int eval_rec(t_node *node, t_env **env, int in_fd)
{
pid_t pid;
int p[2];
@@ -357,117 +104,13 @@ static int eval_rec(t_node *node, t_env **env, int in_fd)
}
}
else if (node->type == CMD_NODE)
- {
result = execute_cmd(&node->content.cmd, env);
- }
else
- {
- printf("Handling unknown node type\n");
- panic("UNREACHABLE");
result = EXIT_FAILURE;
- }
return (result);
}
-int eval(t_node *node, t_env **env)
+int eval(t_node *node, t_env **env)
{
return (eval_rec(node, env, STDIN_FILENO));
}
-//v was auch immmer
-
-// int execute_cmd(t_cmd *cmd, t_env **env)
-// {
-// char *cmd_path;
-// pid_t pid;
-// int status;
-
-// if (handle_redirections(cmd->redirs) == -1)
-// {
-// return (EXIT_FAILURE);
-// }
-// if (is_builtin(cmd->args[0]))
-// {
-// return (execute_builtin(cmd->args, env));
-// }
-// pid = fork();
-// if (pid == -1)
-// {
-// perror("fork");
-// return (EXIT_FAILURE);
-// }
-// if (pid == 0)
-// {
-// cmd_path = get_cmd_path(cmd->args[0], *env);
-// if (!cmd_path)
-// {
-// printf("%s: command not found\n", cmd->args[0]);
-// return (EXIT_FAILURE);
-// }
-// execve(cmd_path, cmd->args, env_to_strlst(*env));
-// perror("execve");
-// exit(EXIT_FAILURE);
-// }
-// waitpid(pid, &status, 0);
-// return (WEXITSTATUS(status));
-// }
-int execute_cmd(t_cmd *cmd, t_env **env)
-{
- char *cmd_path;
- pid_t pid;
- int status;
- int original_stdout;
- int original_stdin;
-
- original_stdout = dup(STDOUT_FILENO);
- original_stdin = dup(STDIN_FILENO);
-
- if (handle_redirections(cmd->redirs) == -1)
- {
- dup2(original_stdout, STDOUT_FILENO);
- dup2(original_stdin, STDIN_FILENO);
- close(original_stdout);
- close(original_stdin);
- return (EXIT_FAILURE);
- }
-
- if (is_builtin(cmd->args[0]))
- {
- int result = execute_builtin(cmd->args, env);
- dup2(original_stdout, STDOUT_FILENO);
- dup2(original_stdin, STDIN_FILENO);
- close(original_stdout);
- close(original_stdin);
- return (result);
- }
-
- pid = fork();
- if (pid == -1)
- {
- perror("fork");
- dup2(original_stdout, STDOUT_FILENO);
- dup2(original_stdin, STDIN_FILENO);
- close(original_stdout);
- close(original_stdin);
- return (EXIT_FAILURE);
- }
- if (pid == 0)
- {
- cmd_path = get_cmd_path(cmd->args[0], *env);
- if (!cmd_path)
- {
- printf("%s: command not found\n", cmd->args[0]);
- exit(EXIT_FAILURE);
- }
- execve(cmd_path, cmd->args, env_to_strlst(*env));
- perror("execve");
- exit(EXIT_FAILURE);
- }
- waitpid(pid, &status, 0);
-
- dup2(original_stdout, STDOUT_FILENO);
- dup2(original_stdin, STDIN_FILENO);
- close(original_stdout);
- close(original_stdin);
-
- return (WEXITSTATUS(status));
-} \ No newline at end of file