Skip to content

Commit bee9142

Browse files
authored
Merge pull request #31 from cuajarsaki/parser_norm
parser norm
2 parents 0f55d27 + e08dd38 commit bee9142

File tree

4 files changed

+217
-120
lines changed

4 files changed

+217
-120
lines changed

src/parser/parser.h

+15-15
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,38 @@
66
/* By: jidler <[email protected]> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2025/03/04 16:00:00 by jidler #+# #+# */
9-
/* Updated: 2025/03/04 19:24:30 by jidler ### ########.fr */
9+
/* Updated: 2025/03/08 22:57:25 by jidler ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

1313
#ifndef PARSER_H
1414
# define PARSER_H
1515

1616
# include "../../shell.h"
17-
# include <stdlib.h>
18-
# include <string.h>
1917
# include <ctype.h>
2018
# include <stdio.h>
21-
22-
23-
19+
# include <stdlib.h>
20+
# include <string.h>
2421

2522
/* ************************************************************************** */
2623
/* UTILITY FUNCTIONS */
2724
/* ************************************************************************** */
2825

29-
void ft_skip_spaces(const char *input, int *curr_pos);
30-
char *ft_realloc_str(char *ptr, size_t new_size);
26+
void ft_skip_spaces(const char *input, int *curr_pos);
27+
char *ft_realloc_str(char *ptr, size_t new_size);
3128

3229
/* ************************************************************************** */
3330
/* ENVIRONMENT EXPANSION */
3431
/* ************************************************************************** */
3532

36-
char *expand_env_token(const char *token, t_env *env_list, int *exit_status);
33+
char *expand_env_token(const char *token, t_env *env_list,
34+
int *exit_status);
3735

3836
/* ************************************************************************** */
3937
/* TOKEN UTILITIES */
4038
/* ************************************************************************** */
4139

42-
char *remove_quotes(const char *token);
40+
char *remove_quotes(const char *token);
4341

4442
/* ************************************************************************** */
4543
/* REDIRECTION PARSING */
@@ -51,7 +49,7 @@ char *remove_quotes(const char *token);
5149
// char *direction;
5250
// } t_redir;
5351

54-
t_redir *get_redir(const char *input, int *curr_pos);
52+
t_redir *get_redir(const char *input, int *curr_pos);
5553

5654
/* ************************************************************************** */
5755
/* TOKEN PARSING */
@@ -63,7 +61,7 @@ t_redir *get_redir(const char *input, int *curr_pos);
6361
// int is_single_quoted;
6462
// } t_token;
6563

66-
t_token *get_token(const char *input, int *curr_pos);
64+
t_token *get_token(const char *input, int *curr_pos);
6765

6866
/* ************************************************************************** */
6967
/* COMMAND PARSING */
@@ -75,7 +73,8 @@ t_token *get_token(const char *input, int *curr_pos);
7573
// t_list *redirs;
7674
// } t_cmd;
7775

78-
t_cmd *get_cmd(const char *input, int *curr_pos, t_env *env_list, int *exit_status);
76+
t_cmd *get_cmd(const char *input, int *curr_pos, t_env *env_list,
77+
int *exit_status);
7978

8079
/* ************************************************************************** */
8180
/* COMMAND GROUP PARSING */
@@ -86,7 +85,8 @@ t_cmd *get_cmd(const char *input, int *curr_pos, t_env *env_list, int *exit_stat
8685
// t_list *cmds;
8786
// } t_command_group;
8887

89-
t_command_group *get_command_group(const char *input, int *curr_pos, t_env *env_list, int *exit_status);
88+
t_command_group *get_command_group(const char *input, int *curr_pos,
89+
t_env *env_list, int *exit_status);
9090

9191
/* ************************************************************************** */
9292
/* AST PARSING */
@@ -97,6 +97,6 @@ t_command_group *get_command_group(const char *input, int *curr_pos, t_env *env_
9797
// t_list *command_groups;
9898
// } t_ast;
9999

100-
t_ast *get_ast(const char *input, t_env *env_list, int *exit_status);
100+
t_ast *get_ast(const char *input, t_env *env_list, int *exit_status);
101101

102102
#endif

src/parser/parser_cmd.c

+64-40
Original file line numberDiff line numberDiff line change
@@ -6,60 +6,85 @@
66
/* By: jidler <[email protected]> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2025/03/04 16:09:28 by jidler #+# #+# */
9-
/* Updated: 2025/03/04 19:25:32 by jidler ### ########.fr */
9+
/* Updated: 2025/03/08 22:41:24 by jidler ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

1313
#include "parser.h"
1414

15-
t_cmd *get_cmd(const char *input, int *curr_pos,
16-
t_env *env_list, int *exit_status)
15+
t_cmd *init_cmd(void)
1716
{
1817
t_cmd *cmd;
19-
t_list *new_node;
20-
t_token *token_struct;
21-
char *final_token;
2218

2319
cmd = (t_cmd *)malloc(sizeof(t_cmd));
2420
if (!cmd)
2521
return (NULL);
2622
cmd->tokens = NULL;
2723
cmd->redirs = NULL;
28-
while (input[*curr_pos] && input[*curr_pos] != '|')
24+
return (cmd);
25+
}
26+
27+
void handle_redirection(t_cmd *cmd, const char *input, int *curr_pos)
28+
{
29+
t_list *new_node;
30+
31+
new_node = ft_lstnew((void *)get_redir(input, curr_pos));
32+
if (!new_node)
33+
return ;
34+
ft_lstadd_back(&cmd->redirs, new_node);
35+
}
36+
37+
void handle_token(t_cmd *cmd, const char *input,
38+
int params[2], t_env *env_list)
39+
{
40+
t_token *token_struct;
41+
t_list *new_node;
42+
char *final_token;
43+
44+
token_struct = get_token(input, &params[0]);
45+
if (!token_struct)
46+
return ;
47+
if (token_struct->is_single_quoted)
48+
final_token = ft_strdup(token_struct->value);
49+
else
50+
final_token = expand_env_token(token_struct->value,
51+
env_list, &params[1]);
52+
free(token_struct->value);
53+
free(token_struct);
54+
new_node = ft_lstnew((void *)final_token);
55+
if (!new_node)
2956
{
30-
ft_skip_spaces(input, curr_pos);
31-
if (input[*curr_pos] == '>' || input[*curr_pos] == '<')
32-
{
33-
new_node = ft_lstnew((void *)get_redir(input, curr_pos));
34-
if (!new_node)
35-
return (NULL);
36-
ft_lstadd_back(&cmd->redirs, new_node);
37-
}
57+
free(final_token);
58+
return ;
59+
}
60+
ft_lstadd_back(&cmd->tokens, new_node);
61+
}
62+
63+
t_cmd *get_cmd(const char *input, int *curr_pos, t_env *env_list,
64+
int *exit_status)
65+
{
66+
t_cmd *cmd;
67+
int params[2];
68+
69+
params[0] = *curr_pos;
70+
params[1] = *exit_status;
71+
cmd = init_cmd();
72+
if (!cmd)
73+
return (NULL);
74+
while (input[params[0]] && input[params[0]] != '|')
75+
{
76+
ft_skip_spaces(input, &params[0]);
77+
if (input[params[0]] == '>' || input[params[0]] == '<')
78+
handle_redirection(cmd, input, &params[0]);
3879
else
39-
{
40-
token_struct = get_token(input, curr_pos);
41-
if (token_struct)
42-
{
43-
final_token = token_struct->is_single_quoted
44-
? ft_strdup(token_struct->value)
45-
: expand_env_token(token_struct->value,
46-
env_list, exit_status);
47-
free(token_struct->value);
48-
free(token_struct);
49-
new_node = ft_lstnew((void *)final_token);
50-
if (!new_node)
51-
{
52-
free(final_token);
53-
return (NULL);
54-
}
55-
ft_lstadd_back(&cmd->tokens, new_node);
56-
}
57-
}
80+
handle_token(cmd, input, params, env_list);
5881
}
82+
*curr_pos = params[0];
83+
*exit_status = params[1];
5984
return (cmd);
6085
}
6186

62-
t_command_group *get_command_group(const char *input, int *curr_pos,
87+
t_command_group *get_command_group(const char *input, int *curr_pos,
6388
t_env *env_list, int *exit_status)
6489
{
6590
t_command_group *command_group;
@@ -72,19 +97,18 @@ t_command_group *get_command_group(const char *input, int *curr_pos,
7297
while (input[*curr_pos])
7398
{
7499
ft_skip_spaces(input, curr_pos);
75-
cmd = ft_lstnew((void *)get_cmd(input, curr_pos,
76-
env_list, exit_status));
100+
cmd = ft_lstnew((void *)get_cmd(input, curr_pos, env_list,
101+
exit_status));
77102
if (!cmd)
78103
{
79-
ft_lstclear(&command_group->cmds,
80-
(void (*)(void *))free_cmd);
104+
ft_lstclear(&command_group->cmds, (void (*)(void *))free_cmd);
81105
return (NULL);
82106
}
83107
ft_lstadd_back(&command_group->cmds, cmd);
84108
if (input[*curr_pos] == '|' && input[*curr_pos + 1] != '|')
85109
{
86110
(*curr_pos)++;
87-
continue;
111+
continue ;
88112
}
89113
}
90114
return (command_group);

src/parser/parser_env.c

+65-32
Original file line numberDiff line numberDiff line change
@@ -6,59 +6,92 @@
66
/* By: jidler <[email protected]> +#+ +:+ +#+ */
77
/* +#+#+#+#+#+ +#+ */
88
/* Created: 2025/03/04 16:09:32 by jidler #+# #+# */
9-
/* Updated: 2025/03/04 18:55:46 by jidler ### ########.fr */
9+
/* Updated: 2025/03/08 23:01:03 by jidler ### ########.fr */
1010
/* */
1111
/* ************************************************************************** */
1212

1313
#include "parser.h"
1414

15+
char *handle_exit_status_expansion(char *result, int *exit_status)
16+
{
17+
char fixed_value[12];
18+
19+
ft_snprintf(fixed_value, sizeof(fixed_value), "%d", *exit_status);
20+
result = ft_realloc_str(result, ft_strlen(result) + ft_strlen(fixed_value)
21+
+ 1);
22+
strcat(result, fixed_value);
23+
return (result);
24+
}
25+
26+
char *extract_variable_name(const char *token, int *i)
27+
{
28+
char *var_name;
29+
int j;
30+
31+
j = *i + 1;
32+
while (token[j] && (isalnum(token[j]) || token[j] == '_'))
33+
j++;
34+
var_name = strndup(&token[*i + 1], j - *i - 1);
35+
*i = j;
36+
return (var_name);
37+
}
38+
39+
char *expand_variable(char *result, const char *token, int *i,
40+
t_env *env_list)
41+
{
42+
char *var_name;
43+
char *var_value;
44+
char *temp_result;
45+
size_t new_size;
46+
47+
var_name = extract_variable_name(token, i);
48+
var_value = get_env_value(env_list, var_name);
49+
free(var_name);
50+
new_size = ft_strlen(result) + 1;
51+
if (var_value)
52+
new_size += ft_strlen(var_value);
53+
temp_result = ft_realloc_str(result, new_size);
54+
if (var_value)
55+
strcat(temp_result, var_value);
56+
return (temp_result);
57+
}
58+
59+
char *process_regular_characters(char *result, const char *token, int *i)
60+
{
61+
size_t new_len;
62+
63+
new_len = ft_strlen(result) + 2;
64+
result = ft_realloc_str(result, new_len);
65+
strncat(result, &token[*i], 1);
66+
(*i)++;
67+
return (result);
68+
}
69+
1570
char *expand_env_token(const char *token, t_env *env_list, int *exit_status)
1671
{
1772
char *result;
18-
char *var_value;
19-
char *var_name;
20-
int i = 0, j;
21-
int len = ft_strlen(token);
73+
int i;
2274

75+
i = 0;
2376
result = ft_calloc(1, sizeof(char));
2477
if (!result)
2578
return (NULL);
26-
27-
while (i < len)
79+
while (token[i])
2880
{
2981
if (token[i] == '$' && token[i + 1] == '?')
3082
{
31-
char fixed_value[12];
32-
ft_snprintf(fixed_value, sizeof(fixed_value), "%d", *exit_status);
33-
result = ft_realloc_str(result, ft_strlen(result) + ft_strlen(fixed_value) + 1);
34-
strcat(result, fixed_value);
83+
result = handle_exit_status_expansion(result, exit_status);
3584
i += 2;
3685
}
37-
else if (token[i] == '$' && token[i + 1] && (isalnum(token[i + 1]) || token[i + 1] == '_'))
86+
else if (token[i] == '$' && token[i + 1] && (isalnum(token[i + 1])
87+
|| token[i + 1] == '_'))
3888
{
39-
j = i + 1;
40-
while (token[j] && (isalnum(token[j]) || token[j] == '_'))
41-
j++;
42-
var_name = strndup(&token[i + 1], j - i - 1);
43-
var_value = get_env_value(env_list, var_name);
44-
free(var_name);
45-
46-
if (var_value)
47-
result = ft_realloc_str(result, ft_strlen(result) + ft_strlen(var_value) + 1);
48-
else
49-
result = ft_realloc_str(result, ft_strlen(result) + 1);
50-
strcat(result, var_value ? var_value : "");
51-
52-
i = j;
89+
result = expand_variable(result, token, &i, env_list);
5390
}
5491
else
5592
{
56-
size_t new_len = ft_strlen(result) + 2;
57-
result = ft_realloc_str(result, new_len);
58-
strncat(result, &token[i], 1);
59-
i++;
93+
result = process_regular_characters(result, token, &i);
6094
}
6195
}
62-
63-
return result;
96+
return (result);
6497
}

0 commit comments

Comments
 (0)