aboutsummaryrefslogtreecommitdiff
path: root/src/collect_redirs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/collect_redirs.c')
-rw-r--r--src/collect_redirs.c116
1 files changed, 109 insertions, 7 deletions
diff --git a/src/collect_redirs.c b/src/collect_redirs.c
index be0e00f..4b7b955 100644
--- a/src/collect_redirs.c
+++ b/src/collect_redirs.c
@@ -6,14 +6,50 @@
/* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/08/02 13:49:31 by dkaiser #+# #+# */
-/* Updated: 2025/01/13 09:52:00 by chuhlig ### ########.fr */
+/* Updated: 2025/01/11 11:43:13 by chuhlig ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
+// static t_token *collect_redir(t_token **tokens, t_redirection *result,
+// t_token *cur);
+// static void collect_and_check_redir(t_token **tokens, t_redirection *result,
+// t_token **cur);
static void collect_and_check_redir(t_redirection *result, t_token **cur);
static void set_redir(t_redirection *redir, int type, char *specifier);
+// static int is_output_redir(int i);
+
+// static char *read_heredoc(char *delimiter)
+// {
+// char *line;
+// char *result;
+// size_t len;
+
+// result = NULL;
+// while (1)
+// {
+// line = readline("> ");
+// if (!line || ft_strcmp(line, delimiter) == 0)
+// {
+// free(line);
+// break ;
+// }
+// if (result)
+// len = ft_strlen(result);
+// else
+// len = 0;
+// result = realloc(result, len + ft_strlen(line) + 2);
+// if (!result)
+// return (NULL);
+// ft_strcpy(result + len, line);
+// strcat(result, "\n");
+// free(line);
+// }
+// return (result);
+// }
+
+//v2.0
static char *read_heredoc(char *delimiter)
{
@@ -73,7 +109,7 @@ t_redirection *collect_redirs(t_token **tokens)
while (cur != NULL && cur->next != NULL)
{
if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN)
- collect_and_check_redir(result, &cur);
+ collect_and_check_redir(result, &cur);// her is diff
else if (cur->type == REDIR_TOKEN)
return (free(result), NULL);
else
@@ -84,12 +120,62 @@ t_redirection *collect_redirs(t_token **tokens)
return (result);
}
+// static void collect_and_check_redir(t_token **tokens, t_redirection *result,
+// t_token **cur)
+// {
+// int is_redir_only;
+
+// is_redir_only = 0;
+// if ((*cur)->previous == NULL && (*cur)->next->next == NULL)
+// is_redir_only = 1;
+// *cur = collect_redir(tokens, result, *cur);
+// if (is_redir_only)
+// *tokens = NULL;
+// }
+
+// static t_token *collect_redir(t_token **tokens, t_redirection *result,
+// t_token *cur)
+// {
+// set_redir(&result[is_output_redir(cur->content.redir_type)],
+// cur->content.redir_type, cur->next->content.string);
+// cur = cur->next;
+// free_token_and_connect(cur->previous);
+// if (cur->next != NULL)
+// {
+// if (cur->previous == NULL)
+// *tokens = cur->next;
+// cur = cur->next;
+// free_token_and_connect(cur->previous);
+// }
+// else
+// {
+// free_token(cur);
+// return (NULL);
+// }
+// return (cur);
+// }
+
static void set_redir(t_redirection *redir, int type, char *specifier)
{
redir->type = type;
redir->specifier = specifier;
}
+// static int is_output_redir(int i)
+// {
+// if (i & (INPUT_FILE | INPUT_LIMITER))
+// return (0);
+// else if (i & (OUTPUT_APPEND | OUTPUT_OVERRIDE))
+// return (1);
+// else
+// {
+// panic(UNREACHABLE);
+// return (-1);
+// }
+// }
+
+//2.0
+
static void collect_and_check_redir(t_redirection *result, t_token **cur)
{
char *heredoc_data;
@@ -98,6 +184,7 @@ static void collect_and_check_redir(t_redirection *result, t_token **cur)
heredoc_data = NULL;
if ((*cur)->content.redir_type == INPUT_LIMITER)
{
+ // Handle Here Document (<<)
heredoc_data = read_heredoc((*cur)->next->content.string);
if (!heredoc_data)
{
@@ -107,20 +194,35 @@ static void collect_and_check_redir(t_redirection *result, t_token **cur)
set_redir(&result[0], INPUT_LIMITER, heredoc_data);
}
else if ((*cur)->content.redir_type == INPUT_FILE)
+ {
+ // Handle Input File (<)
set_redir(&result[0], INPUT_FILE, ft_strdup((*cur)->next->content.string));
+ }
else if ((*cur)->content.redir_type == OUTPUT_OVERRIDE)
+ {
+ // Handle Output File Overwrite (>)
set_redir(&result[1], OUTPUT_OVERRIDE, ft_strdup((*cur)->next->content.string));
+ }
else if ((*cur)->content.redir_type == OUTPUT_APPEND)
+ {
+ // Handle Output File Append (>>)
set_redir(&result[1], OUTPUT_APPEND, ft_strdup((*cur)->next->content.string));
+ }
else
+ {
+ // Handle unexpected cases
printf("Unknown redirection type encountered\n");
+ }
+ // Advance the token pointer to skip the redirection token and its argument
next_token = (*cur)->next;
- free_token_and_connect(*cur);
+ free_token_and_connect(*cur); // Free the current redirection token
if (next_token)
{
- *cur = next_token->next;
- free_token_and_connect(next_token);
+ *cur = next_token->next; // Move to the next token after the argument
+ free_token_and_connect(next_token); // Free the argument token
}
else
- *cur = NULL;
-}
+ {
+ *cur = NULL; // No more tokens
+ }
+} \ No newline at end of file