maxishell
Implementation of a shell for Linux-like systems
Loading...
Searching...
No Matches
loc_env_var_handler.c
Go to the documentation of this file.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* loc_env_var_handler.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: rmikhayl <marvin@42.fr> +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2024/09/04 16:46:53 by rmikhayl #+# #+# */
9/* Updated: 2024/09/09 16:19:56 by dmdemirk ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13#include <tokens.h>
14
15void handle_local_vars(t_ms_data *data, char *arg);
16char *process_argument(char *arg, t_ms_data *data);
17
18void handle_split_allocation(t_ast *command_node, int *current_size, \
19 int required_size)
20{
21 if (required_size > *current_size)
22 {
23 command_node->args = ft_realloc_array(command_node->args, \
24 *current_size, required_size);
25 *current_size = required_size;
26 }
27}
28
29void split_loc_vars(t_ast *command_node, char *processed_arg, \
30 int *current_size, int *i)
31{
32 char **split_arg;
33 int split_count;
34 int required_size;
35 int j;
36
37 split_arg = ft_split(processed_arg, ' ');
38 split_count = ft_len_2d_arr(split_arg);
39 if (split_count > 1)
40 {
41 required_size = *i + split_count;
42 handle_split_allocation(command_node, current_size, required_size);
43 j = 0;
44 while (j < split_count)
45 {
46 command_node->args[*i + j] = ft_strdup(split_arg[j]);
47 j++;
48 }
49 *i += split_count;
50 }
51 else
52 {
53 command_node->args[*i] = ft_strdup(processed_arg);
54 (*i)++;
55 }
56 ft_free_2d_arr(split_arg);
57}
58
59void post_process_command_args(t_ast *command_node, int arg_count, \
60 t_ms_data *data)
61{
62 int i;
63 char *processed_arg;
64 int current_size;
65 char *tmp_proc_arg;
66
67 i = 0;
68 tmp_proc_arg = NULL;
69 current_size = arg_count;
70 while (i < current_size)
71 {
72 if (!is_in_single_quotes(command_node->args[i]))
73 {
74 handle_local_vars(data, command_node->args[i]);
75 tmp_proc_arg = process_argument(command_node->args[i], data);
76 }
77 else
78 tmp_proc_arg = ft_substr(command_node->args[i], 1, \
79 ft_strlen(command_node->args[i]) - 2);
80 free(command_node->args[i]);
81 processed_arg = ft_remove_quotes(tmp_proc_arg, '\"');
82 free(tmp_proc_arg);
83 split_loc_vars(command_node, processed_arg, &current_size, &i);
84 free(processed_arg);
85 }
86 command_node->args[current_size] = NULL;
87}
88
89char *append_expanded_var(char *processed_arg, char *tmp_ad, \
90 char *expanded_var)
91{
92 char *tmp;
93 char *tmp_2;
94
95 tmp = ft_strjoin_free(processed_arg, expanded_var);
96 tmp_ad = tmp_adj(tmp);
97 free(expanded_var);
98 tmp_2 = ft_strdup(tmp_ad);
99 free(tmp_ad);
100 return (tmp_2);
101}
102
103char *process_argument(char *arg, t_ms_data *data)
104{
105 char *start;
106 char *processed_arg;
107 char *tmp_ad;
108 char *expanded_var;
109
110 tmp_ad = NULL;
111 processed_arg = ft_strdup("");
112 start = arg;
113 while (*start != '\0')
114 {
115 if (*start == '$')
116 {
117 expanded_var = expand_variable(&start, data);
118 if (expanded_var != NULL)
119 {
120 processed_arg = append_expanded_var(processed_arg, \
121 tmp_ad, expanded_var);
122 free(tmp_ad);
123 }
124 }
125 else
126 processed_arg = append_literal(&start, processed_arg);
127 }
128 return (processed_arg);
129}
void ft_free_2d_arr(char **arr)
char ** ft_realloc_array(char **array, int old_size, int new_size)
char * ft_substr(char const *s, unsigned int start, size_t len)
Definition ft_substr.c:27
char * ft_remove_quotes(char *str, char quote_type)
char ** ft_split(char const *s, char c)
Definition ft_split.c:95
char * ft_strjoin_free(char *s1, char *s2)
size_t ft_strlen(const char *s)
Definition ft_strlen.c:15
char * ft_strdup(const char *s)
Definition ft_strdup.c:23
int ft_len_2d_arr(char **array)
void handle_split_allocation(t_ast *command_node, int *current_size, int required_size)
void handle_local_vars(t_ms_data *data, char *arg)
void split_loc_vars(t_ast *command_node, char *processed_arg, int *current_size, int *i)
char * append_expanded_var(char *processed_arg, char *tmp_ad, char *expanded_var)
void post_process_command_args(t_ast *command_node, int arg_count, t_ms_data *data)
char * process_argument(char *arg, t_ms_data *data)
Definition tokens.h:50
char ** args
Definition tokens.h:52
char * append_literal(char **start, char *processed_arg)
char * expand_variable(char **start, t_ms_data *data)
char * tmp_adj(char *arg)
int is_in_single_quotes(char *arg)