From 42c693f70ff375ce15b5783c251bfa723ac528ce Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Mon, 1 Jul 2024 11:44:06 +0200 Subject: Remove unneeded struct s_sequence --- include/ast.h | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/include/ast.h b/include/ast.h index e6ad25d..356ccdd 100644 --- a/include/ast.h +++ b/include/ast.h @@ -6,18 +6,13 @@ /* By: dkaiser next->previous = NULL; free(token); } + +void free_token_and_connect(t_token *token) +{ + if (token->type == STRING_TOKEN) + free(token->content.string); + if (token->previous != NULL) + token->previous->next = token->next; + if (token->next != NULL) + token->next->previous = token->previous; + free(token); +} -- cgit v1.2.3 From 5316c9880416b77b4b97b07fd6ae47f171a0ba23 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Mon, 8 Jul 2024 16:15:32 +0200 Subject: Move assign into cmd node --- include/ast.h | 8 +++----- src/free_node.c | 24 +++++++++++++++++++----- src/new_node.c | 17 +++-------------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/include/ast.h b/include/ast.h index 356ccdd..6479272 100644 --- a/include/ast.h +++ b/include/ast.h @@ -6,7 +6,7 @@ /* By: dkaiser type == ASSIGN_NODE) - free_assign_node(node); - else if (node->type == PIPE_NODE) + if (node->type == PIPE_NODE) free_pipe_node(node); else if (node->type == CMD_NODE) free_cmd_node(node); @@ -54,6 +52,22 @@ static void free_cmd_node(t_node *node) i++; } free(node->content.cmd.args); + free_assigns(node->content.cmd.assigns); free(node->content.cmd.redirs[0].specifier); free(node->content.cmd.redirs[1].specifier); } + +static void free_assigns(t_assign **assigns) +{ + int i; + + i = 0; + while (assigns[i] != NULL) + { + free(assigns[i]->var); + free(assigns[i]->value); + free(assigns[i]); + i++; + } + free(assigns); +} diff --git a/src/new_node.c b/src/new_node.c index 4cdbf9a..c334eb6 100644 --- a/src/new_node.c +++ b/src/new_node.c @@ -6,7 +6,7 @@ /* By: dkaiser content.assign.var = var; - node->content.assign.value = value; - return (node); -} - t_node *new_pipe_node(t_node *left, t_node *right) { t_node *node; @@ -47,7 +35,7 @@ t_node *new_pipe_node(t_node *left, t_node *right) return (node); } -t_node *new_cmd_node(char **args, t_redirection redirs[2]) +t_node *new_cmd_node(char **args, t_assign **assigns, t_redirection redirs[2]) { t_node *node; @@ -55,6 +43,7 @@ t_node *new_cmd_node(char **args, t_redirection redirs[2]) if (node == NULL) return (NULL); node->content.cmd.args = args; + node->content.cmd.assigns = assigns; node->content.cmd.redirs[0] = redirs[0]; node->content.cmd.redirs[1] = redirs[1]; return (node); -- cgit v1.2.3 From 3b2efe45ce23f51e97a54b820b41f230b99bbab2 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Mon, 8 Jul 2024 16:35:30 +0200 Subject: Add most of the parser --- src/parser.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/parser.c diff --git a/src/parser.c b/src/parser.c new file mode 100644 index 0000000..5bf82f6 --- /dev/null +++ b/src/parser.c @@ -0,0 +1,106 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser next = ft_lstnew(parse_statement(current_tokens)); + current = current->next; + } + if (current == NULL) + { + // Free: ft_lstclear(&result, free_node); + return (NULL); + } + current_tokens = split_at_first(&tokens, NEWLINE_TOKEN); + } + return (result); +} + +static t_node *parse_statement(t_token *tokens) +{ + t_token *left_side_tokens; + + left_side_tokens = split_at_first(&tokens, PIPE_TOKEN); + if (tokens != NULL) + { + return (new_pipe_node(parse_cmd(left_side_tokens), + parse_statement(tokens))); + } + else + { + return (parse_cmd(left_side_tokens)); + } +} + +static t_node *parse_cmd(t_token *tokens) +{ + char **args; + t_assign **assigns; + t_redirection **redirs; + + redirs = collect_redirs(&tokens); + assigns = collect_assigns(&tokens); + args = collect_args(&tokens); + return (new_cmd_node(args, assigns, redirs)); +} + +t_token *split_at_first(t_token **tokens, int type) +{ + t_token *split; + t_token *result; + + split = find_token_by_type(*tokens, type); + if (split == NULL) + { + result = *tokens; + *tokens = NULL; + return (result); + } + result = *tokens; + *tokens = split->next; + free_token(split); + return (result); +} + +static t_token *find_token_by_type(t_token *tokens, int type) +{ + while (tokens != NULL) + { + if (tokens->type == type) + return (tokens); + tokens = tokens->next; + } + return (NULL); +} -- cgit v1.2.3 From a5dd924bea37a0786dcf2b95690452f7714043f6 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Mon, 8 Jul 2024 17:30:58 +0200 Subject: Add most of parse_cmd --- src/free_token.c | 4 +- src/parse_cmd.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 src/parse_cmd.c diff --git a/src/free_token.c b/src/free_token.c index 7be6b0e..083484c 100644 --- a/src/free_token.c +++ b/src/free_token.c @@ -6,7 +6,7 @@ /* By: dkaiser type == STRING_TOKEN) - free(token->content.string); if (token->previous != NULL) token->previous->next = NULL; if (token->next != NULL) diff --git a/src/parse_cmd.c b/src/parse_cmd.c new file mode 100644 index 0000000..981bbbb --- /dev/null +++ b/src/parse_cmd.c @@ -0,0 +1,109 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parse_cmd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser +#include + +static t_redirection **collect_redirs(t_token **tokens); +static t_assign **collect_assigns(t_token **tokens); +static char **collect_args(t_token **tokens); +static t_assign *to_assign(char *str); + +t_node *parse_cmd(t_token *tokens) +{ + char **args; + t_assign **assigns; + t_redirection redirs[2]; + + redirs = collect_redirs(&tokens); + assigns = collect_assigns(&tokens); + args = collect_args(&tokens); + return (new_cmd_node(args, assigns, redirs)); +} + +static t_redirection **collect_redirs(t_token **tokens) +{ + return (NULL); +} + +static t_assign **collect_assigns(t_token **tokens) +{ + int i; + t_assign **result; + + i = 0; + while (ft_strchr(tokens[i]->content.string, '=') != NULL) + { + i++; + } + result = malloc(sizeof(t_assign *) * (i + 1)); + if (result == NULL) + { + // free everything + return (NULL); + } + result[i] = NULL; + i--; + while (i >= 0) + { + result[i] = to_assign(tokens[i]->content.string); + i--; + } + return (result); +} + +static char **collect_args(t_token **tokens) +{ + int i; + char **result; + + i = 0; + while (tokens[i] != NULL) + { + i++; + } + result = malloc(sizeof(char *) * (i + 1)); + if (result == NULL) + { + // free everything in the token + return (NULL); + } + i = 0; + while (tokens[i] != NULL) + { + result[i] = tokens[i]->content.string; + free_token(tokens[i]); + i++; + } + result[i] = NULL; + return (result); +} + +static t_assign *to_assign(char *str) +{ + t_assign *result; + char *split; + + result = malloc(sizeof(t_assign)); + if (result == NULL) + return (NULL); + split = ft_strchr(str, '='); + if (split == NULL) + return (NULL); + *split = '\0'; + result->var = str; + result->value = split + 1; + return (result); +} -- cgit v1.2.3 From 389f7c91f0ebd59c80b457fce63ad383dfd27f85 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Tue, 9 Jul 2024 12:54:35 +0200 Subject: Get colllect_args() to work properly --- src/parse_cmd.c | 57 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/parse_cmd.c b/src/parse_cmd.c index 981bbbb..739c022 100644 --- a/src/parse_cmd.c +++ b/src/parse_cmd.c @@ -64,33 +64,6 @@ static t_assign **collect_assigns(t_token **tokens) return (result); } -static char **collect_args(t_token **tokens) -{ - int i; - char **result; - - i = 0; - while (tokens[i] != NULL) - { - i++; - } - result = malloc(sizeof(char *) * (i + 1)); - if (result == NULL) - { - // free everything in the token - return (NULL); - } - i = 0; - while (tokens[i] != NULL) - { - result[i] = tokens[i]->content.string; - free_token(tokens[i]); - i++; - } - result[i] = NULL; - return (result); -} - static t_assign *to_assign(char *str) { t_assign *result; @@ -107,3 +80,33 @@ static t_assign *to_assign(char *str) result->value = split + 1; return (result); } + +static char **collect_args(t_token **tokens) +{ + t_token *cur; + char **result; + int i; + + cur = *tokens; + i = 0; + while (cur != NULL) { + i++; + cur = cur->next; + } + result = malloc(sizeof(char*) * (i + 1)); + if (!result) + { + //free all tokens; + return (NULL); + } + cur = *tokens; + i = 0; + while(cur != NULL) + { + result[i] = cur->content.string; + // free token + i++; + cur = cur->next; + } + return (result); +} -- cgit v1.2.3 From 16ca09f57525cd9a4e7eb82ce70e4c1e0cb85a31 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Tue, 9 Jul 2024 12:56:09 +0200 Subject: Remove redundant funcs and add parse funcs to header and Makefile --- Makefile | 2 +- include/minishell.h | 6 +++++- src/free_node.c | 8 +------- src/parser.c | 15 +-------------- 4 files changed, 8 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index 41551ec..8896ded 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ HEADERS = -I include -I $(LIB_DIR)/libft VPATH := src SRC := main.c debug_tools.c init.c signal_handling.c repl.c new_token.c \ - free_token.c new_node.c free_node.c + free_token.c new_node.c free_node.c parser.c parse_cmd.c OBJ_DIR := _obj OBJ := $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o)) diff --git a/include/minishell.h b/include/minishell.h index a528e4a..2411cc5 100644 --- a/include/minishell.h +++ b/include/minishell.h @@ -6,7 +6,7 @@ /* By: dkaiser content.assign.var); - free(node->content.assign.value); -} - static void free_pipe_node(t_node *node) { free_node(node->content.pipe.left); diff --git a/src/parser.c b/src/parser.c index 5bf82f6..66c6785 100644 --- a/src/parser.c +++ b/src/parser.c @@ -6,7 +6,7 @@ /* By: dkaiser type == STRING_TOKEN) - free(token->content.string); if (token->previous != NULL) token->previous->next = token->next; if (token->next != NULL) diff --git a/src/parse_cmd.c b/src/parse_cmd.c index 739c022..4fa2bc2 100644 --- a/src/parse_cmd.c +++ b/src/parse_cmd.c @@ -6,17 +6,13 @@ /* By: dkaiser -#include -static t_redirection **collect_redirs(t_token **tokens); +static t_redirection *collect_redirs(t_token **tokens); static t_assign **collect_assigns(t_token **tokens); static char **collect_args(t_token **tokens); static t_assign *to_assign(char *str); @@ -25,7 +21,7 @@ t_node *parse_cmd(t_token *tokens) { char **args; t_assign **assigns; - t_redirection redirs[2]; + t_redirection *redirs; redirs = collect_redirs(&tokens); assigns = collect_assigns(&tokens); @@ -33,80 +29,144 @@ t_node *parse_cmd(t_token *tokens) return (new_cmd_node(args, assigns, redirs)); } -static t_redirection **collect_redirs(t_token **tokens) +static t_redirection *collect_redirs(t_token **tokens) { - return (NULL); + t_redirection *result; + t_token *cur; + + cur = *tokens; + result = malloc(sizeof(t_redirection) * 2); + if (result == NULL) + { + // free all tokens + return (NULL); + } + result[0].specifier = NULL; + result[0].type = 0; + result[1].specifier = NULL; + result[1].type = 0; + while (cur != NULL && cur->next != NULL) + { + if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) + { + if (cur->content.redir_type & (INPUT_FILE | INPUT_LIMITER)) + { + result[0].type = cur->content.redir_type; + result[0].specifier = cur->next->content.string; + } + else if (cur->content.redir_type & (OUTPUT_APPEND | OUTPUT_OVERRIDE)) + { + result[1].type = cur->content.redir_type; + result[1].specifier = cur->next->content.string; + } + cur = cur->next; + free_token_and_connect(cur->previous); + if (cur->next != NULL) + { + cur = cur->next; + free_token_and_connect(cur->previous); + } + else + { + free_token(cur); + } + } + else if (cur->type == REDIR_TOKEN) + { + // err Parsing error + free(result); + return (NULL); + } + else + { + cur = cur->next; + } + } + return (result); } static t_assign **collect_assigns(t_token **tokens) { - int i; + t_token *cur; t_assign **result; + int i; + cur = *tokens; i = 0; - while (ft_strchr(tokens[i]->content.string, '=') != NULL) + while (cur != NULL && cur->type == STRING_TOKEN + && cur->content.string[0] != '"' && cur->content.string[0] != '\'' + && ft_strchr(cur->content.string, '=') != NULL) { i++; + cur = cur->next; } result = malloc(sizeof(t_assign *) * (i + 1)); - if (result == NULL) + if (!result) { - // free everything + // free all tokens return (NULL); } - result[i] = NULL; - i--; - while (i >= 0) + cur = *tokens; + i = 0; + while (cur != NULL && cur->type == STRING_TOKEN + && cur->content.string[0] != '"' && cur->content.string[0] != '\'' + && ft_strchr(cur->content.string, '=') != NULL) { - result[i] = to_assign(tokens[i]->content.string); - i--; + result[i] = to_assign(cur->content.string); + i++; + cur = cur->next; + free_token(cur->previous); } + *tokens = cur; + result[i] = NULL; return (result); } static t_assign *to_assign(char *str) { t_assign *result; - char *split; + char *split_pos; + split_pos = ft_strchr(str, '='); + *split_pos = '\0'; result = malloc(sizeof(t_assign)); if (result == NULL) + { return (NULL); - split = ft_strchr(str, '='); - if (split == NULL) - return (NULL); - *split = '\0'; + } result->var = str; - result->value = split + 1; + result->value = split_pos + 1; return (result); } static char **collect_args(t_token **tokens) { - t_token *cur; - char **result; - int i; + t_token *cur; + char **result; + int i; cur = *tokens; i = 0; - while (cur != NULL) { + while (cur != NULL) + { i++; cur = cur->next; } - result = malloc(sizeof(char*) * (i + 1)); + result = malloc(sizeof(char *) * (i + 1)); if (!result) { - //free all tokens; + // free all tokens; return (NULL); } cur = *tokens; i = 0; - while(cur != NULL) + while (cur != NULL) { result[i] = cur->content.string; // free token i++; cur = cur->next; } + result[i] = NULL; return (result); } -- cgit v1.2.3 From 47a68b82e0463f5dfd4bd8a9c4b32b4c5fbcb610 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Mon, 22 Jul 2024 15:07:59 +0200 Subject: Fix errors and make the parser work --- include/ast.h | 9 ++++++--- src/free_node.c | 13 ++++++++----- src/new_node.c | 3 ++- src/parse_cmd.c | 29 ++++++++++++++++------------- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/include/ast.h b/include/ast.h index b0ed996..bf19083 100644 --- a/include/ast.h +++ b/include/ast.h @@ -6,12 +6,12 @@ /* By: dkaiser content.cmd.args[i] != NULL) + while (node->content.cmd.args != NULL && node->content.cmd.args[i] != NULL) { free(node->content.cmd.args[i]); i++; } free(node->content.cmd.args); free_assigns(node->content.cmd.assigns); - free(node->content.cmd.redirs[0].specifier); - free(node->content.cmd.redirs[1].specifier); + if (node->content.cmd.redirs[0].type != 0 && node->content.cmd.redirs[0].specifier != NULL) + free(node->content.cmd.redirs[0].specifier); + if (node->content.cmd.redirs[1].type != 0 && node->content.cmd.redirs[0].specifier != NULL) + free(node->content.cmd.redirs[1].specifier); } static void free_assigns(t_assign **assigns) @@ -56,10 +58,11 @@ static void free_assigns(t_assign **assigns) int i; i = 0; + if (assigns == 0) + return ; while (assigns[i] != NULL) { free(assigns[i]->var); - free(assigns[i]->value); free(assigns[i]); i++; } diff --git a/src/new_node.c b/src/new_node.c index c334eb6..c2458d0 100644 --- a/src/new_node.c +++ b/src/new_node.c @@ -6,7 +6,7 @@ /* By: dkaiser content.cmd.assigns = assigns; node->content.cmd.redirs[0] = redirs[0]; node->content.cmd.redirs[1] = redirs[1]; + free(redirs); return (node); } diff --git a/src/parse_cmd.c b/src/parse_cmd.c index 4fa2bc2..0173caa 100644 --- a/src/parse_cmd.c +++ b/src/parse_cmd.c @@ -6,7 +6,7 @@ /* By: dkaiser next != NULL) { if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) { if (cur->content.redir_type & (INPUT_FILE | INPUT_LIMITER)) - { - result[0].type = cur->content.redir_type; - result[0].specifier = cur->next->content.string; - } + idx = 0; else if (cur->content.redir_type & (OUTPUT_APPEND | OUTPUT_OVERRIDE)) - { - result[1].type = cur->content.redir_type; - result[1].specifier = cur->next->content.string; - } + idx = 1; + set_redir(&result[idx], cur->content.redir_type, + cur->next->content.string); cur = cur->next; free_token_and_connect(cur->previous); if (cur->next != NULL) @@ -170,3 +167,9 @@ static char **collect_args(t_token **tokens) result[i] = NULL; return (result); } + +static void set_redir(t_redirection *redir, int type, char *specifier) +{ + redir->type = type; + redir->specifier = specifier; +} -- cgit v1.2.3 From c16b4655f77db2f152625f226dc66ccc922671b4 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Mon, 22 Jul 2024 16:33:08 +0200 Subject: Add print_ast function --- Makefile | 3 ++- include/minishell.h | 4 ++-- src/print_ast.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 src/print_ast.c diff --git a/Makefile b/Makefile index 8896ded..a56ada3 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,8 @@ HEADERS = -I include -I $(LIB_DIR)/libft VPATH := src SRC := main.c debug_tools.c init.c signal_handling.c repl.c new_token.c \ - free_token.c new_node.c free_node.c parser.c parse_cmd.c + free_token.c new_node.c free_node.c parser.c parse_cmd.c \ + print_ast.c OBJ_DIR := _obj OBJ := $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o)) diff --git a/include/minishell.h b/include/minishell.h index 2411cc5..d980d42 100644 --- a/include/minishell.h +++ b/include/minishell.h @@ -6,7 +6,7 @@ /* By: dkaiser type == CMD_NODE) + print_cmd_node(ast, indent); + else if (ast->type == PIPE_NODE) + { + printf("%*s%s", indent, "", "* PIPE"); + print_ast_rec(ast->content.pipe.left, indent + 2); + print_ast_rec(ast->content.pipe.right, indent + 2); + } +} + +static void print_cmd_node(t_node *ast, int indent) +{ + int i; + + printf("\n%*s%s", indent, "", "* CMD"); + i = 0; + printf("\n%*sARGS:", indent + 2, ""); + while (ast->content.cmd.args[i] != NULL) + { + printf(" %s", ast->content.cmd.args[i]); + i++; + } + i = 0; + printf("\n%*sASSIGNS:", indent + 2, ""); + while (ast->content.cmd.assigns[i] != NULL) + { + printf(" %s=%s", ast->content.cmd.assigns[i]->var, + ast->content.cmd.assigns[i]->value); + i++; + } + printf("\n%*sREDIRS:", indent + 2, ""); + printf("\n%*sIN: %d %s", indent + 4, "", ast->content.cmd.redirs[0].type, + ast->content.cmd.redirs[0].specifier); + printf("\n%*sOUT: %d %s", indent + 4, "", ast->content.cmd.redirs[1].type, + ast->content.cmd.redirs[1].specifier); +} -- cgit v1.2.3 From 2252eac3c49fa373d295d485e4f04ea41a475efb Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Fri, 2 Aug 2024 13:23:49 +0200 Subject: Fix print_ast --- src/print_ast.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/print_ast.c b/src/print_ast.c index d1f5095..94f813f 100644 --- a/src/print_ast.c +++ b/src/print_ast.c @@ -6,7 +6,7 @@ /* By: dkaiser type == PIPE_NODE) { - printf("%*s%s", indent, "", "* PIPE"); + printf("\n%*s%s", indent, "", "* PIPE"); print_ast_rec(ast->content.pipe.left, indent + 2); print_ast_rec(ast->content.pipe.right, indent + 2); } @@ -44,9 +44,9 @@ static void print_cmd_node(t_node *ast, int indent) printf("\n%*s%s", indent, "", "* CMD"); i = 0; printf("\n%*sARGS:", indent + 2, ""); - while (ast->content.cmd.args[i] != NULL) + while (ast->content.cmd.args != NULL && ast->content.cmd.args[i] != NULL) { - printf(" %s", ast->content.cmd.args[i]); + printf(" '%s'", ast->content.cmd.args[i]); i++; } i = 0; -- cgit v1.2.3 From d59a405311553dbe568ed79a5449f3222f8495ad Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Fri, 2 Aug 2024 13:24:48 +0200 Subject: Fix some issues in parse_cmd.c --- src/parse_cmd.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/parse_cmd.c b/src/parse_cmd.c index 0173caa..8ed9785 100644 --- a/src/parse_cmd.c +++ b/src/parse_cmd.c @@ -6,7 +6,7 @@ /* By: dkaiser previous); if (cur->next != NULL) { + if (cur->previous == NULL) + *tokens = cur->next; cur = cur->next; free_token_and_connect(cur->previous); } @@ -111,8 +113,15 @@ static t_assign **collect_assigns(t_token **tokens) { result[i] = to_assign(cur->content.string); i++; - cur = cur->next; - free_token(cur->previous); + if (cur->next != NULL) + { + cur = cur->next; + free_token(cur->previous); + } + else + { + free_token(cur); + } } *tokens = cur; result[i] = NULL; @@ -157,7 +166,7 @@ static char **collect_args(t_token **tokens) } cur = *tokens; i = 0; - while (cur != NULL) + while (cur != NULL && cur->type == STRING_TOKEN) { result[i] = cur->content.string; // free token -- cgit v1.2.3 From 82c1eed4f7795ef135a586af2fb334145b64b2f6 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Fri, 2 Aug 2024 14:14:42 +0200 Subject: Add function free_tokens() --- include/token.h | 3 ++- src/free_token.c | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/token.h b/include/token.h index d61195d..72ca5e5 100644 --- a/include/token.h +++ b/include/token.h @@ -6,7 +6,7 @@ /* By: dkaiser next->previous = token->previous; free(token); } + +void free_tokens(t_token *tokens) +{ + while (tokens->next != NULL) + { + tokens = tokens->next; + free_token(tokens->previous); + } + free_token(tokens); +} -- cgit v1.2.3 From c7a4494fd97b7e80665cbd47ed96bc37bf5800e5 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Fri, 2 Aug 2024 15:29:00 +0200 Subject: Refactor parser * Fix norme for free_node.c * Uglify parser.c * Merge parser updates into refactor-parser * Outsource collect_assigns and collect_redirs * Make parse_cmd.c norme conform * Make free_tokens() norme conform * Make collect_assigns.c norme conform * Some refactoring of collect_redirs * Refactor collect_redirs--- include/minishell.h | 16 +++--- src/collect_assigns.c | 84 ++++++++++++++++++++++++++++++ src/collect_redirs.c | 80 +++++++++++++++++++++++++++++ src/free_node.c | 8 +-- src/free_token.c | 4 +- src/parse_cmd.c | 138 ++------------------------------------------------ src/parser.c | 14 ++--- 7 files changed, 193 insertions(+), 151 deletions(-) create mode 100644 src/collect_assigns.c create mode 100644 src/collect_redirs.c diff --git a/include/minishell.h b/include/minishell.h index d980d42..b21acbc 100644 --- a/include/minishell.h +++ b/include/minishell.h @@ -6,7 +6,7 @@ /* By: dkaiser # include -int init(void); -int init_signal_handling(void); +int init(void); +int init_signal_handling(void); -void repl(const char *prompt); +void repl(const char *prompt); -t_list *parse(t_token *tokens); -t_node *parse_cmd(t_token *tokens); +t_list *parse(t_token *tokens); +t_node *parse_cmd(t_token *tokens); +t_redirection *collect_redirs(t_token **tokens); +t_assign **collect_assigns(t_token **tokens); -void print_ast(t_node *ast); +void print_ast(t_node *ast); #endif diff --git a/src/collect_assigns.c b/src/collect_assigns.c new file mode 100644 index 0000000..da43503 --- /dev/null +++ b/src/collect_assigns.c @@ -0,0 +1,84 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* collect_assigns.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser type == STRING_TOKEN + && !is_quote(cur->content.string[0]) && ft_strchr(cur->content.string, + '=') != NULL) + { + result[i++] = to_assign(cur->content.string); + if (cur->next != NULL) + { + cur = cur->next; + free_token(cur->previous); + } + else + free_token(cur); + } + *tokens = cur; + result[i] = NULL; + return (result); +} + +static t_assign *to_assign(char *str) +{ + t_assign *result; + char *split_pos; + + split_pos = ft_strchr(str, '='); + *split_pos = '\0'; + result = malloc(sizeof(t_assign)); + if (result == NULL) + { + return (NULL); + } + result->var = str; + result->value = split_pos + 1; + return (result); +} + +static int count_tokens(t_token *tokens) +{ + int len; + + len = 0; + while (tokens != NULL && tokens->type == STRING_TOKEN + && !is_quote(tokens->content.string[0]) + && ft_strchr(tokens->content.string, '=') != NULL) + { + len++; + tokens = tokens->next; + } + return (len); +} + +static int is_quote(char c) +{ + return (c == '"' || c == '\''); +} diff --git a/src/collect_redirs.c b/src/collect_redirs.c new file mode 100644 index 0000000..76b08da --- /dev/null +++ b/src/collect_redirs.c @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* collect_redirs.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser next != NULL) + { + if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) + collect_redir(tokens, result, cur); + else if (cur->type == REDIR_TOKEN) + { + dbg("TODO: Add parsing errmsg"); + return (free(result), NULL); + } + else + cur = cur->next; + } + return (result); +} + +static void 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); +} + +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); + } +} diff --git a/src/free_node.c b/src/free_node.c index f8677d5..f387c0a 100644 --- a/src/free_node.c +++ b/src/free_node.c @@ -6,7 +6,7 @@ /* By: dkaiser content.cmd.args); free_assigns(node->content.cmd.assigns); - if (node->content.cmd.redirs[0].type != 0 && node->content.cmd.redirs[0].specifier != NULL) + if (node->content.cmd.redirs[0].type != 0 + && node->content.cmd.redirs[0].specifier != NULL) free(node->content.cmd.redirs[0].specifier); - if (node->content.cmd.redirs[1].type != 0 && node->content.cmd.redirs[0].specifier != NULL) + if (node->content.cmd.redirs[1].type != 0 + && node->content.cmd.redirs[0].specifier != NULL) free(node->content.cmd.redirs[1].specifier); } diff --git a/src/free_token.c b/src/free_token.c index 3c8ce1a..9b035ac 100644 --- a/src/free_token.c +++ b/src/free_token.c @@ -6,7 +6,7 @@ /* By: dkaiser next != NULL) { diff --git a/src/parse_cmd.c b/src/parse_cmd.c index 8ed9785..068a4c1 100644 --- a/src/parse_cmd.c +++ b/src/parse_cmd.c @@ -6,18 +6,13 @@ /* By: dkaiser next != NULL) - { - if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) - { - if (cur->content.redir_type & (INPUT_FILE | INPUT_LIMITER)) - idx = 0; - else if (cur->content.redir_type & (OUTPUT_APPEND | OUTPUT_OVERRIDE)) - idx = 1; - set_redir(&result[idx], 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); - } - } - else if (cur->type == REDIR_TOKEN) - { - // err Parsing error - free(result); - return (NULL); - } - else - { - cur = cur->next; - } - } - return (result); -} - -static t_assign **collect_assigns(t_token **tokens) -{ - t_token *cur; - t_assign **result; - int i; - - cur = *tokens; - i = 0; - while (cur != NULL && cur->type == STRING_TOKEN - && cur->content.string[0] != '"' && cur->content.string[0] != '\'' - && ft_strchr(cur->content.string, '=') != NULL) - { - i++; - cur = cur->next; - } - result = malloc(sizeof(t_assign *) * (i + 1)); - if (!result) - { - // free all tokens - return (NULL); - } - cur = *tokens; - i = 0; - while (cur != NULL && cur->type == STRING_TOKEN - && cur->content.string[0] != '"' && cur->content.string[0] != '\'' - && ft_strchr(cur->content.string, '=') != NULL) - { - result[i] = to_assign(cur->content.string); - i++; - if (cur->next != NULL) - { - cur = cur->next; - free_token(cur->previous); - } - else - { - free_token(cur); - } - } - *tokens = cur; - result[i] = NULL; - return (result); -} - -static t_assign *to_assign(char *str) -{ - t_assign *result; - char *split_pos; - - split_pos = ft_strchr(str, '='); - *split_pos = '\0'; - result = malloc(sizeof(t_assign)); - if (result == NULL) - { - return (NULL); - } - result->var = str; - result->value = split_pos + 1; - return (result); -} - static char **collect_args(t_token **tokens) { t_token *cur; @@ -159,26 +40,17 @@ static char **collect_args(t_token **tokens) cur = cur->next; } result = malloc(sizeof(char *) * (i + 1)); - if (!result) - { - // free all tokens; - return (NULL); - } + if (result == NULL) + return (free_tokens(*tokens), NULL); cur = *tokens; i = 0; while (cur != NULL && cur->type == STRING_TOKEN) { result[i] = cur->content.string; - // free token i++; cur = cur->next; + free_token(cur->previous); } result[i] = NULL; return (result); } - -static void set_redir(t_redirection *redir, int type, char *specifier) -{ - redir->type = type; - redir->specifier = specifier; -} diff --git a/src/parser.c b/src/parser.c index 66c6785..f9484c9 100644 --- a/src/parser.c +++ b/src/parser.c @@ -6,7 +6,7 @@ /* By: dkaiser next; } if (current == NULL) - { - // Free: ft_lstclear(&result, free_node); - return (NULL); - } + return (ft_lstclear(&result, free_node_wrapper), NULL); current_tokens = split_at_first(&tokens, NEWLINE_TOKEN); } return (result); @@ -91,3 +88,8 @@ static t_token *find_token_by_type(t_token *tokens, int type) } return (NULL); } + +static void free_node_wrapper(void *node) +{ + free_node((t_node *)node); +} -- cgit v1.2.3 From f53acc629b1b3e7f4097eef1e26841ef0b9b24c6 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Sun, 11 Aug 2024 12:15:40 +0200 Subject: Fix parser bugs --- Makefile | 2 +- src/collect_redirs.c | 13 +++++++++---- src/parse_cmd.c | 10 ++++------ src/tokenizer.c | 4 +++- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 3450e3c..d4778bf 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ HEADERS = -I include -I $(LIB_DIR)/libft VPATH := src SRC := main.c debug_tools.c init.c signal_handling.c repl.c new_token.c \ free_token.c new_node.c free_node.c tokenizer.c parser.c \ - parse_cmd.c print_ast.c + parse_cmd.c collect_assigns.c collect_redirs.c print_ast.c OBJ_DIR := _obj OBJ := $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o)) diff --git a/src/collect_redirs.c b/src/collect_redirs.c index 76b08da..d50bec4 100644 --- a/src/collect_redirs.c +++ b/src/collect_redirs.c @@ -6,13 +6,13 @@ /* By: dkaiser next != NULL) { if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) - collect_redir(tokens, result, cur); + cur = collect_redir(tokens, result, cur); else if (cur->type == REDIR_TOKEN) { dbg("TODO: Add parsing errmsg"); @@ -43,7 +43,8 @@ t_redirection *collect_redirs(t_token **tokens) return (result); } -static void collect_redir(t_token **tokens, t_redirection *result, t_token *cur) +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); @@ -57,7 +58,11 @@ static void collect_redir(t_token **tokens, t_redirection *result, t_token *cur) 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) diff --git a/src/parse_cmd.c b/src/parse_cmd.c index 068a4c1..eb70f0d 100644 --- a/src/parse_cmd.c +++ b/src/parse_cmd.c @@ -6,7 +6,7 @@ /* By: dkaiser next; - } result = malloc(sizeof(char *) * (i + 1)); if (result == NULL) return (free_tokens(*tokens), NULL); @@ -46,10 +43,11 @@ static char **collect_args(t_token **tokens) i = 0; while (cur != NULL && cur->type == STRING_TOKEN) { + if (cur->previous) + free_token(cur->previous); result[i] = cur->content.string; i++; cur = cur->next; - free_token(cur->previous); } result[i] = NULL; return (result); diff --git a/src/tokenizer.c b/src/tokenizer.c index 34685ac..efbf723 100644 --- a/src/tokenizer.c +++ b/src/tokenizer.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/28 20:55:50 by chuhlig #+# #+# */ -/* Updated: 2024/08/09 15:40:00 by chuhlig ### ########.fr */ +/* Updated: 2024/08/11 11:40:35 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -110,4 +110,6 @@ void tokenizer(char *s, t_token **token_list) pos = i + 1; } } + while ((*token_list)->previous) + *token_list = (*token_list)->previous; } -- cgit v1.2.3 From 99e8655aaf9827c7d5248c7f3d0913fcb1377cfb Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Sun, 11 Aug 2024 12:27:02 +0200 Subject: Remove assigns I found out that there's a difference between shell variables and env variables. We don't have to implement shell variables, so I removed all code that handles them. --- Makefile | 2 +- include/ast.h | 12 ++------ include/minishell.h | 3 +- src/collect_assigns.c | 84 --------------------------------------------------- src/free_node.c | 20 +----------- src/new_node.c | 5 ++- src/parse_cmd.c | 6 ++-- src/print_ast.c | 10 +----- 8 files changed, 10 insertions(+), 132 deletions(-) delete mode 100644 src/collect_assigns.c diff --git a/Makefile b/Makefile index d4778bf..827c317 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ HEADERS = -I include -I $(LIB_DIR)/libft VPATH := src SRC := main.c debug_tools.c init.c signal_handling.c repl.c new_token.c \ free_token.c new_node.c free_node.c tokenizer.c parser.c \ - parse_cmd.c collect_assigns.c collect_redirs.c print_ast.c + parse_cmd.c collect_redirs.c print_ast.c OBJ_DIR := _obj OBJ := $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o)) diff --git a/include/ast.h b/include/ast.h index bf19083..cd2f9c9 100644 --- a/include/ast.h +++ b/include/ast.h @@ -6,7 +6,7 @@ /* By: dkaiser type == STRING_TOKEN - && !is_quote(cur->content.string[0]) && ft_strchr(cur->content.string, - '=') != NULL) - { - result[i++] = to_assign(cur->content.string); - if (cur->next != NULL) - { - cur = cur->next; - free_token(cur->previous); - } - else - free_token(cur); - } - *tokens = cur; - result[i] = NULL; - return (result); -} - -static t_assign *to_assign(char *str) -{ - t_assign *result; - char *split_pos; - - split_pos = ft_strchr(str, '='); - *split_pos = '\0'; - result = malloc(sizeof(t_assign)); - if (result == NULL) - { - return (NULL); - } - result->var = str; - result->value = split_pos + 1; - return (result); -} - -static int count_tokens(t_token *tokens) -{ - int len; - - len = 0; - while (tokens != NULL && tokens->type == STRING_TOKEN - && !is_quote(tokens->content.string[0]) - && ft_strchr(tokens->content.string, '=') != NULL) - { - len++; - tokens = tokens->next; - } - return (len); -} - -static int is_quote(char c) -{ - return (c == '"' || c == '\''); -} diff --git a/src/free_node.c b/src/free_node.c index f387c0a..6eae059 100644 --- a/src/free_node.c +++ b/src/free_node.c @@ -6,7 +6,7 @@ /* By: dkaiser content.cmd.args); - free_assigns(node->content.cmd.assigns); if (node->content.cmd.redirs[0].type != 0 && node->content.cmd.redirs[0].specifier != NULL) free(node->content.cmd.redirs[0].specifier); @@ -54,19 +52,3 @@ static void free_cmd_node(t_node *node) && node->content.cmd.redirs[0].specifier != NULL) free(node->content.cmd.redirs[1].specifier); } - -static void free_assigns(t_assign **assigns) -{ - int i; - - i = 0; - if (assigns == 0) - return ; - while (assigns[i] != NULL) - { - free(assigns[i]->var); - free(assigns[i]); - i++; - } - free(assigns); -} diff --git a/src/new_node.c b/src/new_node.c index c2458d0..6da9f9e 100644 --- a/src/new_node.c +++ b/src/new_node.c @@ -6,7 +6,7 @@ /* By: dkaiser content.cmd.args = args; - node->content.cmd.assigns = assigns; node->content.cmd.redirs[0] = redirs[0]; node->content.cmd.redirs[1] = redirs[1]; free(redirs); diff --git a/src/parse_cmd.c b/src/parse_cmd.c index eb70f0d..2755cae 100644 --- a/src/parse_cmd.c +++ b/src/parse_cmd.c @@ -6,7 +6,7 @@ /* By: dkaiser content.cmd.args[i]); i++; } - i = 0; - printf("\n%*sASSIGNS:", indent + 2, ""); - while (ast->content.cmd.assigns[i] != NULL) - { - printf(" %s=%s", ast->content.cmd.assigns[i]->var, - ast->content.cmd.assigns[i]->value); - i++; - } printf("\n%*sREDIRS:", indent + 2, ""); printf("\n%*sIN: %d %s", indent + 4, "", ast->content.cmd.redirs[0].type, ast->content.cmd.redirs[0].specifier); -- cgit v1.2.3 From bc55ab9621c9aa80c12f257d043597188f6ad64d Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Thu, 29 Aug 2024 15:31:07 +0200 Subject: Update repl --- src/repl.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/repl.c b/src/repl.c index fe9faf3..01bcd76 100644 --- a/src/repl.c +++ b/src/repl.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/24 16:07:04 by dkaiser #+# #+# */ -/* Updated: 2024/08/11 14:41:29 by chuhlig ### ########.fr */ +/* Updated: 2024/08/29 15:29:16 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,8 +17,7 @@ void repl(const char *prompt) { char *input; t_token *token_list; - t_token *current; - t_token *next; + t_list *lines; while (1) { @@ -27,14 +26,10 @@ void repl(const char *prompt) return ; add_history(input); token_list = NULL; - current = token_list; tokenizer(input, &token_list, '\0'); - while (current != NULL) - { - next = current->next; - free_token(current); - current = next; - } + lines = parse(token_list); + if (lines) + print_ast(lines->content); free(input); } } -- cgit v1.2.3 From 61fe4e28bf95f782105a2907cd6fbfc196a6874b Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Thu, 29 Aug 2024 16:44:56 +0200 Subject: Handle empty input --- src/repl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/repl.c b/src/repl.c index 01bcd76..02fb879 100644 --- a/src/repl.c +++ b/src/repl.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/24 16:07:04 by dkaiser #+# #+# */ -/* Updated: 2024/08/29 15:29:16 by dkaiser ### ########.fr */ +/* Updated: 2024/08/29 15:37:27 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,6 +24,8 @@ void repl(const char *prompt) input = readline(prompt); if (input == NULL) return ; + if (input[0] == '\0') + continue ; add_history(input); token_list = NULL; tokenizer(input, &token_list, '\0'); -- cgit v1.2.3 From f24b063f2135f495193dac4847b9f2489d1d954a Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Fri, 13 Sep 2024 16:23:04 +0200 Subject: Fix SEGV on invalid redirection --- src/new_node.c | 14 +++++++++----- src/print_ast.c | 6 ++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/new_node.c b/src/new_node.c index 6da9f9e..5c770aa 100644 --- a/src/new_node.c +++ b/src/new_node.c @@ -6,7 +6,7 @@ /* By: dkaiser content.cmd.args = args; - node->content.cmd.redirs[0] = redirs[0]; - node->content.cmd.redirs[1] = redirs[1]; - free(redirs); - return (node); + if (redirs != NULL) + { + node->content.cmd.redirs[0] = redirs[0]; + node->content.cmd.redirs[1] = redirs[1]; + free(redirs); + return (node); + } + return (NULL); } t_node *new_string_node(char *string) diff --git a/src/print_ast.c b/src/print_ast.c index a511246..e1f0158 100644 --- a/src/print_ast.c +++ b/src/print_ast.c @@ -6,7 +6,7 @@ /* By: dkaiser type == CMD_NODE) + if (!ast) + panic("Parsing error"); + else if (ast->type == CMD_NODE) print_cmd_node(ast, indent); else if (ast->type == PIPE_NODE) { -- cgit v1.2.3 From 60adeb49de9458b4e2af0abd1c7b256da0950bc3 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Fri, 13 Sep 2024 16:27:13 +0200 Subject: Fix norme issues for env.h and repl.c TODO: Fix for tokenizer.c as well. This was probably already solved in another branch though. --- include/env.h | 23 ++++++++++++----------- src/repl.c | 4 ++-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/include/env.h b/include/env.h index 1ea6f2e..f3d3c75 100644 --- a/include/env.h +++ b/include/env.h @@ -6,18 +6,19 @@ /* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/24 16:07:04 by dkaiser #+# #+# */ -/* Updated: 2024/08/29 15:37:27 by dkaiser ### ########.fr */ +/* Updated: 2024/09/13 16:26:35 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ void repl(const char *prompt) { char *input; t_token *token_list; - t_list *lines; + t_list *lines; while (1) { -- cgit v1.2.3 From 2a3c0b5dd78c7305ef154c2579225dba81813ad2 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Tue, 17 Sep 2024 14:39:04 +0200 Subject: Fix pipe parsing error --- src/parser.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/parser.c b/src/parser.c index f9484c9..4ad514d 100644 --- a/src/parser.c +++ b/src/parser.c @@ -6,11 +6,12 @@ /* By: dkaiser next; + if (result == split) + result = NULL; free_token(split); return (result); } -- cgit v1.2.3 From cf8754ca029817f092f5159b1c4bc3bbabec4217 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Tue, 17 Sep 2024 15:09:24 +0200 Subject: Add error messages --- src/collect_redirs.c | 4 ++-- src/parser.c | 3 ++- src/print_ast.c | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/collect_redirs.c b/src/collect_redirs.c index d50bec4..9beddf7 100644 --- a/src/collect_redirs.c +++ b/src/collect_redirs.c @@ -6,7 +6,7 @@ /* By: dkaiser type == REDIR_TOKEN) { - dbg("TODO: Add parsing errmsg"); + printf("Parsing error.\n"); return (free(result), NULL); } else diff --git a/src/parser.c b/src/parser.c index 4ad514d..6993a1f 100644 --- a/src/parser.c +++ b/src/parser.c @@ -6,7 +6,7 @@ /* By: dkaiser type == CMD_NODE) print_cmd_node(ast, indent); else if (ast->type == PIPE_NODE) -- cgit v1.2.3 From e8891daeb2e9cf26dc6be1f4d3693734d7a9c5c1 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Tue, 17 Sep 2024 17:25:28 +0200 Subject: Fix redir ignored at end --- src/collect_redirs.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/collect_redirs.c b/src/collect_redirs.c index 9beddf7..79ae95c 100644 --- a/src/collect_redirs.c +++ b/src/collect_redirs.c @@ -6,7 +6,7 @@ /* By: dkaiser next; } + if (cur && cur->type == REDIR_TOKEN) + { + printf("Parsing error.\n"); + return (free(result), NULL); + } return (result); } -- cgit v1.2.3 From 1fec66236f1811a3eeac673d0002fe8d9d3d8835 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Tue, 17 Sep 2024 19:25:13 +0200 Subject: Fix error message printing --- src/collect_redirs.c | 16 +++++++++------- src/new_node.c | 4 +++- src/parser.c | 40 ++++++++++------------------------------ 3 files changed, 22 insertions(+), 38 deletions(-) diff --git a/src/collect_redirs.c b/src/collect_redirs.c index 79ae95c..60f197b 100644 --- a/src/collect_redirs.c +++ b/src/collect_redirs.c @@ -6,7 +6,7 @@ /* By: dkaiser next != NULL) { if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) + { + 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; + } else if (cur->type == REDIR_TOKEN) - { - printf("Parsing error.\n"); return (free(result), NULL); - } else cur = cur->next; } if (cur && cur->type == REDIR_TOKEN) - { - printf("Parsing error.\n"); return (free(result), NULL); - } return (result); } diff --git a/src/new_node.c b/src/new_node.c index 5c770aa..c58d291 100644 --- a/src/new_node.c +++ b/src/new_node.c @@ -6,7 +6,7 @@ /* By: dkaiser next = ft_lstnew(parse_statement(current_tokens)); - current = current->next; - } - if (current == NULL) - return (ft_lstclear(&result, free_node_wrapper), NULL); - current_tokens = split_at_first(&tokens, NEWLINE_TOKEN); - } - return (result); + if ((*tokens).type == PIPE_TOKEN) + result = NULL; + else + result = parse_statement(tokens); + if (result == NULL) + printf("Parsing error.\n"); + return (ft_lstnew(result)); } static t_node *parse_statement(t_token *tokens) @@ -53,7 +39,6 @@ static t_node *parse_statement(t_token *tokens) if (left_side_tokens == NULL) { free_tokens(tokens); - printf("Parsing error.\n"); return (NULL); } else if (tokens != NULL) @@ -97,8 +82,3 @@ static t_token *find_token_by_type(t_token *tokens, int type) } return (NULL); } - -static void free_node_wrapper(void *node) -{ - free_node((t_node *)node); -} -- cgit v1.2.3 From e7d58349800bd6bb0f139eec411bfd434f2c824f Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Tue, 17 Sep 2024 19:28:37 +0200 Subject: Make norminette happy and fry my brain. I just summoned some cosmic horror, but at least norminette doesn't complain anymore. --- src/collect_redirs.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/collect_redirs.c b/src/collect_redirs.c index 60f197b..8917c78 100644 --- a/src/collect_redirs.c +++ b/src/collect_redirs.c @@ -6,7 +6,7 @@ /* By: dkaiser type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) { - 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; + *tokens = (t_token *)(((unsigned long)*tokens) & (~0 + * (!cur->previous && !cur->next->next))); } else if (cur->type == REDIR_TOKEN) return (free(result), NULL); -- cgit v1.2.3 From 4765148b87b6c095aae1b32b023d5815356584c3 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Tue, 17 Sep 2024 19:49:29 +0200 Subject: Banish the cosmic horror --- src/collect_redirs.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/collect_redirs.c b/src/collect_redirs.c index 8917c78..9ac1605 100644 --- a/src/collect_redirs.c +++ b/src/collect_redirs.c @@ -6,7 +6,7 @@ /* By: dkaiser next != NULL) { if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) - { - cur = collect_redir(tokens, result, cur); - *tokens = (t_token *)(((unsigned long)*tokens) & (~0 - * (!cur->previous && !cur->next->next))); - } + collect_and_check_redir(tokens, result, &cur); else if (cur->type == REDIR_TOKEN) return (free(result), NULL); else @@ -46,6 +44,19 @@ 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) { -- cgit v1.2.3