-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathminishell.h
More file actions
351 lines (320 loc) · 10.4 KB
/
minishell.h
File metadata and controls
351 lines (320 loc) · 10.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* minishell.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: mel-gand <mel-gand@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/05/07 17:12:52 by mel-gand #+# #+# */
/* Updated: 2023/07/15 18:53:47 by mel-gand ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef MINISHELL_H
# define MINISHELL_H
# include "ft_printf/ft_printf.h"
# include "libf/libft.h"
# include <dirent.h>
# include <errno.h>
# include <fcntl.h>
# include <limits.h>
# include <readline/history.h>
# include <readline/readline.h>
# include <signal.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
/*
t_list {
void *content;
t_list *next;
}
t_env {
char *key;
char *value;
}
void destroy_env(t_env *var)
{
free(var->key);
free(var->value);
free(var);
}
typedef void (*t_lstdel)(void *);
env_node = malloc(sizeof(t_list));
env_entry = malloc(sizeof(t_env));
env_node->content = env_entry;
ft_lstclear(&lst, (t_lstdel) destroy_env);
*/
extern int g_exit;
typedef struct s_env
{
char *all;
char *key;
char *value;
struct s_env *next;
} t_env;
typedef struct s_var
{
t_env *tmp;
t_env *free_node;
t_env *prev;
} t_var;
typedef enum e_data
{
WORD = 1,
COMMAND,
FLAG,
REDIR_IN,
REDIR_OUT,
HERE_DOC,
DREDIR_OUT,
ENV,
DOC,
DELIMITER,
WALLO,
} t_dt;
typedef struct s_lexer
{
t_env *env;
t_env *exp;
char **ar_env;
int i;
int j;
int start;
int end;
char **word;
char **token;
int curr_wnb;
char *line;
int pipe_nb;
} t_lexer;
typedef struct s_define_data
{
int name;
t_dt state;
char *data;
char *copy_data;
int ex_dollar;
} t_data;
typedef struct s_red
{
int name;
char *data;
char *copy_data;
int ex_dollar;
int check_amb;
int *fd;
} t_red;
typedef struct s_commands
{
char **cmd;
int nb_cmd;
int dt_nb;
t_data *dt;
int ext_dollar;
int i;
int nb_red;
char **new_cmd;
t_red *red;
} t_cmd;
typedef struct s_env_exp
{
int i;
int j;
int check;
char ev;
} t_var_exp_env;
typedef struct s_parser
{
t_cmd *comm;
t_lexer *lex;
int nb_arg;
int fd_d;
} t_parser;
typedef struct s_init
{
DIR *openfile;
struct dirent *entry;
int i;
int check;
int x;
} t_init;
//------------------start linked--------------//
void add_node(t_env *node, t_env **head);
t_env *creat_list(int nb);
t_env *creat_node(char *data);
//t_env *remove_node(t_env *head, char *id);
void remove_node(t_env **head, char *id);
int length(t_env *env);
//-------------------end linked-------------//
//------------------start command--------------//
void creating_new_env(t_lexer *lex, char **env);
//------------------end command--------------//
//---------free-------//
void free_double_array(char **str);
//------------lexer---------------//
int tokenizer(t_lexer *lex);
int check_unclosed_quotes(char *str);
int skip_quote(char *line, int i);
int dquote(char *str, int *i);
int quote(char *str, int *i);
//------------split token---------//
int split_token(t_lexer *lex);
int split_spaces(t_lexer *lex);
int split_pipe_redir(t_lexer *lex);
int split_pipe_heredoc(t_lexer *lex);
void count_tokens(t_lexer *lex);
// int find_end_utils(t_lexer *lex);
int split_quotes(char *line, int i);
void define_word_token(t_lexer *lex);
//--------------error-------------//
int quotes_error(t_lexer *lex);
int pipe_error(t_lexer *lex);
int redir_pipe_error_one_arg(t_lexer *lex);
int redir_pipe_error_mult_arg(t_lexer *lex);
// int tokenizer_error(t_lexer *lex);
//-----------parsing-----------//
int parser(t_lexer *lex);
void fill_command(t_parser *parser);
int count_red(t_cmd *comm);
void fill_red(t_cmd *comm, int nb);
int check_red(t_cmd *comm, int i);
int count_newcmd(char *data);
void check_and_fill_newcmd(t_cmd *comm);
void ft_split_data(t_cmd *comm, int i, int *j);
void handle_data(t_parser *parser);
//-------commands/builtins------//
void builtin_commands(t_parser *parser, int i);
char *get_env(t_parser *parser, char *str);
void update_env(t_parser *parser, char *var);
void echo_command(char **argv);
void cd_command(t_parser *parser, char **argv);
void pwd_command(void);
void exit_command(t_parser *parser, char **argv);
char *special_var(char **argv);
int alloc_newarg(char *argv);
char *copy(char *newarg, char *g_exit, int *idx);
void export_command(t_parser *parser, int i);
int existing_key(t_env *exn, char *str);
void ft_tran_env(t_lexer *lex);
void fill_dt_utils(char *env, t_env *tmp1, t_env *tmp2,
t_var_exp_env *var);
void env_command(t_parser *parser, int i);
int check_valid_key(char *str);
int find_end_key(char *str);
int check_exist_key(t_env *exn, char *key);
void remove_and_replace_value(t_parser *parser, t_env *exp,
int i, int j);
int check_dataenvexp(char *str);
void creat_add_node(t_parser *parser, int i, int j, char exv);
int find_ed(char *env, int i, int check);
void protect_malloc(char **ar_env);
void unset_command(t_parser *parser);
//-----------executor----------//
void executor(t_parser *parser);
void handle_cmd(t_parser *parser);
int is_builtin(char **cmd);
void exec_cmd_in_pipe(t_parser *parser, int *cid, int i,
int fd_her);
void exec_one_cmd(t_parser *parser, int *cid, int i, int fd_her);
void print_error(t_parser *parser, char *execpath, int i);
void fd_error(t_parser *parser);
void dup_and_close(t_parser *parser, int fd_in, int fd_out,
int i);
void waitchild_and_save_exit(int *cid, int i);
int handle_heredoc(t_parser *parser, int i);
char *special_var_in_heredoc(char *input);
int check_special_variable(char *input);
char *const *find_execpath(t_parser *parser, int i);
void exec_cmd(t_parser *parser, int i);
int check_redirect(t_cmd *cmd, int fd_her);
int check_ambiguous(t_red *red);
int open_redirect(t_cmd *cmd, int fd_her);
int parser(t_lexer *lex);
void fill_command(t_parser *parser);
void fill_newcmd_red(t_parser *parser);
void define_data(t_cmd *comm, char *data, int pos);
int find_data_redir(int *name, char *data);
void check_pos_one(t_cmd *comm, char *data, int pos);
void handle_data(t_parser *parser);
char *copy_quote(char *data, int *i, char *new_data);
void fill_data(t_cmd comm);
int check_ex_dollar(char *data);
int check_if_dollar_expand(char *data, char c, int j);
int check_valid(char *data, int i);
int ft_check_expand_delimiter(char *delimiter);
void find_dollar(t_parser *parser, t_cmd *cmd);
char *find_dollar_utils(t_parser *parser, char *data, int j,
char e);
void check_dollar(t_parser *parser, char *dquote,
char **new_data);
void expand_data(t_env *env, char *data, int *j,
char **new_data);
int check_exit(t_env *env, char *envmnt, char **new_data);
int check_valid(char *data, int i);
char *ft_copier(char add, char *new_data);
int check_quote(char *data, int i);
void handal_wildcard(t_parser *parser, t_cmd *cmd);
void free_parser(t_parser *parser);
void print(t_parser *parser, int nb_red, int nb_newcmd, int i);
//-----------squipe quote----------//
char *if_quote_fill(char *data, int *u, char *new_cmd);
//--------------utils-----------//
void ft_calcule_etoile(char *data, int *i);
int check_position_etoile(char *data, char c);
int check_valid_first(char *entry_name, char *patern);
int check_valid_last(char *entry_name, char *patern);
int lenght_patern(char **patern);
//--------------utils-----------//
int *check_exict_patern(t_parser *parser, char *data, int *nb_w,
DIR *OPENFILE);
int count_nb_newdt(int *nb_w, int i);
//--------find_nw_one_arg-------//
int *find_number_w_one_arg(char *data, int *nb_w,
char **patern);
int *find_patern_one_etoile(int *nb_w, char c, char **patern);
void initialization_new_dt(int j, int k, t_data *new_dt,
t_cmd *cmd);
t_data *cop_current_dt(t_cmd *cmd, int j, int *nb_w, int i);
//--------find_nw_one_arg-------//
int *find_number_w_mult_arg(t_parser *parser, int *nb_w,
char **patern, int nb_arg);
//--------wildcard_position-------//
int *findnbw_in_fl(char *entry_center, char **patern, int *nb_w,
int j);
int *findnbw_in_f(char *entry_center, char **patern, int *nb_w,
int j);
int *findnbw_in_l(char *entry_center, char **patern, int *nb_w,
int j);
int *findnbw_in(char *entry_center, char **patern, int *nb_w,
int j);
//--------wildcard_position-------//
char *find_entry_center(char *entry_name, char *patern, char k);
int find_begining_patern(char *entry_name, char *patern, int *i,
int *j);
int *find_mult_etoile(int *nb_w, char *data, char **patern,
DIR *OPENFILE);
int *ft_tout_file(int *nb_w, DIR *OPENFILE, t_parser *parser);
void initialization_data_cmd(char *entry_d_name, t_cmd *cmd,
int j);
t_data *fill_wildcard_data(t_cmd *cmd, int j, int *nb_w);
//-----------------wildcard-------------------//
//---------------amb_open_file-------------//
int check_ambiguous(t_red *red);
int check_empty(char *copy_data);
int check_multi(char **check_redirect);
int check_multi_arg(char **redirect);
char *fill_check_name(char **redirect, char *check_name, int i,
int j);
int new_data(char **check_redirect, t_red *red);
char *expand_name_file(t_red *red, char **check_redirect);
void new_data_after_check_am(char **check_redirect, t_red *red);
char *fill_new_name(char **check_redirect, int j, int i);
char *split_data(char *copy_data);
int check_nb_redirect(int check, t_red *red,
char **check_redirect);
void print_ambiguous_error(void);
//---------------amb_open_file-------------//
char *copier_exit_status(char *new_data);
void remove_node_utils(t_var *var, t_env **head);
#endif