maxishell
Implementation of a shell for Linux-like systems
Loading...
Searching...
No Matches
loc_env_var_handler_heredoc.c
Go to the documentation of this file.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* loc_env_var_handler_heredoc.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: dmdemirk <dmdemirk@student.42london.c +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2024/07/11 14:32:29 by dmdemirk #+# #+# */
9/* Updated: 2024/07/11 16:00:30 by dmdemirk ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13#include "shell.h"
14#include "tokens.h"
15#include "redirection.h"
16#include "execute.h"
17#include <fcntl.h>
18#include <sys/wait.h>
19#include "signals.h"
20
21static char *assemble_result(char **tokens, size_t result_len);
22char *token_adj(char *arg);
23char *finalize_token(char *tmp_token, char *orig_token);
24size_t process_single_token(char **token, t_ms_data *data);
25size_t process_tokens(char **tokens, t_ms_data *data);
26
27char *process_and_reassemble(char *line, t_ms_data *data)
28{
29 char **tokens;
30 size_t result_len;
31 char *result;
32
33 tokens = ft_split(line, ' ');
34 free(line);
35 if (!tokens)
36 return (NULL);
37 result_len = process_tokens(tokens, data);
38 result = assemble_result(tokens, result_len);
39 ft_free_2d_arr(tokens);
40 return (result);
41}
42
43size_t process_tokens(char **tokens, t_ms_data *data)
44{
45 int i;
46 size_t result_len;
47
48 result_len = 0;
49 i = 0;
50 while (tokens[i])
51 {
52 result_len += process_single_token(&tokens[i], data);
53 i++;
54 }
55 return (result_len);
56}
57
58size_t process_single_token(char **token, t_ms_data *data)
59{
60 char *orig_token;
61 char *tmp_token;
62 char *new_token;
63 size_t new_len;
64
65 orig_token = *token;
66 tmp_token = expand_variable(token, data);
67 new_token = finalize_token(tmp_token, orig_token);
68 *token = new_token;
69 free(orig_token);
70 new_len = ft_strlen(new_token) + 1;
71 return (new_len);
72}
73
74char *finalize_token(char *tmp_token, char *orig_token)
75{
76 char *processed_token;
77 char *new_token;
78
79 if (tmp_token)
80 {
81 processed_token = token_adj(tmp_token);
82 if (processed_token != tmp_token)
83 {
84 new_token = ft_strdup(processed_token);
85 free(tmp_token);
86 }
87 else
88 new_token = tmp_token;
89 free(processed_token);
90 }
91 else
92 new_token = ft_strdup(orig_token);
93 return (new_token);
94}
95
96static char *assemble_result(char **tokens, size_t result_len)
97{
98 char *result;
99 int i;
100
101 result = malloc(result_len + 1);
102 if (!result)
103 return (NULL);
104 *result = '\0';
105 i = 0;
106 while (tokens[i])
107 {
108 ft_strcat(result, tokens[i]);
109 if (tokens[i + 1])
110 ft_strcat(result, " ");
111 i++;
112 }
113 return (result);
114}
void ft_free_2d_arr(char **arr)
char ** ft_split(char const *s, char c)
Definition ft_split.c:95
size_t ft_strlen(const char *s)
Definition ft_strlen.c:15
char * ft_strcat(char *dest, char *src)
Definition ft_strcat.c:26
char * ft_strdup(const char *s)
Definition ft_strdup.c:23
size_t process_tokens(char **tokens, t_ms_data *data)
char * token_adj(char *arg)
static char * assemble_result(char **tokens, size_t result_len)
char * process_and_reassemble(char *line, t_ms_data *data)
size_t process_single_token(char **token, t_ms_data *data)
char * finalize_token(char *tmp_token, char *orig_token)
t_token * new_token(char *value, t_token_type type)
Definition tokeniser.c:67
char * expand_variable(char **start, t_ms_data *data)