Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
yabtaour
GitHub Repository: yabtaour/Minishell-42
Path: blob/main/syntax/syntax_analyzer.c
1407 views
1
/* ************************************************************************** */
2
/* */
3
/* ::: :::::::: */
4
/* syntax_analyzer.c :+: :+: :+: */
5
/* +:+ +:+ +:+ */
6
/* By: ssabbaji <[email protected]> +#+ +:+ +#+ */
7
/* +#+#+#+#+#+ +#+ */
8
/* Created: 2022/07/26 18:17:29 by yabtaour #+# #+# */
9
/* Updated: 2022/09/27 17:42:40 by ssabbaji ### ########.fr */
10
/* */
11
/* ************************************************************************** */
12
13
#include "../minishell.h"
14
15
static int ft_check_start_end(t_data *data)
16
{
17
t_lexer *lexer_clone;
18
int flag;
19
20
flag = 0;
21
lexer_clone = data->lst_lexer;
22
if (lexer_clone->type == PIPE)
23
{
24
flag = 1;
25
printf("Syntax error near unexpected token `%s'\n", lexer_clone->val);
26
g_vars.g_exit_stat = 258;
27
}
28
while (lexer_clone->next)
29
lexer_clone = lexer_clone->next;
30
if ((lexer_clone->type == PIPE) && !flag)
31
{
32
printf("Syntax error near unexpected token `%s'\n", lexer_clone->val);
33
g_vars.g_exit_stat = 258;
34
}
35
return (g_vars.g_exit_stat);
36
}
37
38
static int ft_check_forbidden(t_data *data)
39
{
40
t_lexer *lexer_clone;
41
char c;
42
43
lexer_clone = data->lst_lexer;
44
while (lexer_clone)
45
{
46
if (lexer_clone->type == AND || lexer_clone->type == PARENTHESIS
47
|| (lexer_clone->type == PIPE && ft_strlen(lexer_clone->val) > 1)
48
|| (lexer_clone->type == SEMI))
49
{
50
g_vars.g_exit_stat = 258;
51
c = lexer_clone->val[0];
52
printf("Syntax error near unexpected token `%c'\n", c);
53
return (g_vars.g_exit_stat);
54
}
55
lexer_clone = lexer_clone->next;
56
}
57
return (g_vars.g_exit_stat);
58
}
59
60
int ft_syntax_analyzer(t_data *data)
61
{
62
if (data->lst_lexer)
63
{
64
g_vars.g_exit_stat = ft_check_forbidden(data);
65
if (g_vars.g_exit_stat)
66
return (g_vars.g_exit_stat);
67
g_vars.g_exit_stat = ft_check_start_end(data);
68
if (g_vars.g_exit_stat)
69
return (g_vars.g_exit_stat);
70
g_vars.g_exit_stat = ft_check_quotes(data);
71
if (g_vars.g_exit_stat)
72
return (g_vars.g_exit_stat);
73
g_vars.g_exit_stat = ft_check_between_pipes(data);
74
if (g_vars.g_exit_stat)
75
return (g_vars.g_exit_stat);
76
g_vars.g_exit_stat = ft_check_redirection(data);
77
if (g_vars.g_exit_stat)
78
return (g_vars.g_exit_stat);
79
}
80
return (g_vars.g_exit_stat);
81
}
82
83