From c7aabe7938d4e1000193fa3528f98a6c54f3e4d7 Mon Sep 17 00:00:00 2001 From: gazhonsepaskwa Date: Tue, 18 Feb 2025 11:38:04 +0100 Subject: [PATCH] quote fix in syntax --- includes/parser/parsing.h | 2 +- srcs/parsing/syntax/syntax.c | 4 ++-- srcs/parsing/syntax/syntax_utils2.c | 25 ++++++++++++++++--------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/includes/parser/parsing.h b/includes/parser/parsing.h index 9aa77d6..feaf2f2 100644 --- a/includes/parser/parsing.h +++ b/includes/parser/parsing.h @@ -27,7 +27,7 @@ int is_redir(t_node *cpy); int is_basic_word(t_node *cpy); int syntax_err_mess(char *token_base, int selected); int check_unclosed(char *c, t_node *node); -int check_unclosed_quote(char *c, t_node *node); +bool check_unclosed_quote(char *c, t_node *node); int last_tok_redir(t_node *lst); int last_tok_subsh(t_node *lst); diff --git a/srcs/parsing/syntax/syntax.c b/srcs/parsing/syntax/syntax.c index caddcb7..d6388b0 100644 --- a/srcs/parsing/syntax/syntax.c +++ b/srcs/parsing/syntax/syntax.c @@ -59,9 +59,9 @@ int unclosed(t_node *head) { if (check_unclosed("()", head) != 0) return (syntax_err_mess("()", check_unclosed("()", head))); - if (check_unclosed_quote("\"", head) != 0) + if (check_unclosed_quote("\"", head)) return (syntax_err_mess("\"\"", 1)); - if (check_unclosed_quote("'", head) != 0) + if (check_unclosed_quote("'", head)) return (syntax_err_mess("'", 1)); return (0); } diff --git a/srcs/parsing/syntax/syntax_utils2.c b/srcs/parsing/syntax/syntax_utils2.c index fa9eceb..2a2dc22 100644 --- a/srcs/parsing/syntax/syntax_utils2.c +++ b/srcs/parsing/syntax/syntax_utils2.c @@ -55,23 +55,30 @@ int check_unclosed(char *c, t_node *node) return (0); } -int check_unclosed_quote(char *c, t_node *node) +bool check_unclosed_quote(char *c, t_node *node) { t_node *cpy; - int count; - int len; + int i; + bool closed; + bool in_other_quote; + closed = true; + in_other_quote = false; cpy = node; - count = 0; while (cpy) { - len = ft_strlen(cpy->val); - if (len > 0 && cpy->val[0] == c[0]) + i = 0; + while(cpy->val[i]) { - if (len == 1 || cpy->val[len - 1] != c[0]) - count++; + if ((cpy->val[i] == '"' || cpy->val[i] == '\'') && cpy->val[i] != c[0] && closed) + in_other_quote = !in_other_quote; + if (cpy->val[i] == c[0] && !in_other_quote) + closed = !closed; + i++; } cpy = cpy->next; } - return (count % 2); + if (!closed) + return (true); + return (false); }