maxishell
Implementation of a shell for Linux-like systems
Loading...
Searching...
No Matches
loc_env_var_handler_utils.c
Go to the documentation of this file.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* loc_env_var_handler_utils.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: rmikhayl <marvin@42.fr> +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2024/09/10 01:45:18 by rmikhayl #+# #+# */
9/* Updated: 2024/09/10 01:45:21 by rmikhayl ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13#include "tokens.h"
14
15char *ev_loop(char **start, t_ms_data *data, char *str_start, \
16 char *expanded_str)
17{
18 char *var_name;
19 char *var_start;
20 char *expanded_var;
21 char *tmp;
22 int len_before_var;
23
24 var_start = *start;
25 (*start)++;
26 while (**start && (ft_isalnum(**start) || **start == '_'))
27 (*start)++;
28 var_name = ft_substr(var_start, 0, *start - var_start);
29 expanded_var = expand_env_and_loc_var(var_name, data);
30 free(var_name);
31 len_before_var = var_start - str_start;
32 tmp = ft_substr(str_start, 0, len_before_var);
33 expanded_str = ft_strjoin_free(expanded_str, tmp);
34 free(tmp);
35 expanded_str = ft_strjoin_free(expanded_str, expanded_var);
36 free(expanded_var);
37 return (expanded_str);
38}
39
40char *expand_variable(char **start, t_ms_data *data)
41{
42 char *expanded_str;
43 char *str_start;
44 char *result;
45
46 result = NULL;
47 str_start = *start;
48 expanded_str = ft_strdup("");
49 while (**start && **start != '\0')
50 {
51 if (**start == '$')
52 {
53 expanded_str = ev_loop(start, data, str_start, expanded_str);
54 str_start = *start;
55 str_start = str_start_adj(str_start);
56 }
57 else
58 (*start)++;
59 }
60 if (str_start != *start)
61 {
62 result = ft_substr(str_start, 0, *start - str_start);
63 expanded_str = ft_strjoin_free(expanded_str, result);
64 free(result);
65 }
66 return (expanded_str);
67}
68
69void handle_local_vars(t_ms_data *data, char *arg)
70{
71 char *p;
72 int valid_var;
73
74 p = arg;
75 valid_var = 1;
76 if (arg[0] != '=' && ft_strchr(arg, '='))
77 {
78 while (p < ft_strchr(arg, '='))
79 {
80 if (!ft_isalnum(*p++))
81 {
82 valid_var = 0;
83 break ;
84 }
85 }
86 if (valid_var)
88 }
89}
int handle_add_set_shell_variable(t_env **shell_var, char *line)
char * ft_substr(char const *s, unsigned int start, size_t len)
Definition ft_substr.c:27
int ft_isalnum(int c)
Definition ft_isalnum.c:15
char * ft_strchr(const char *s, int c)
Definition ft_strchr.c:25
char * ft_strjoin_free(char *s1, char *s2)
char * ft_strdup(const char *s)
Definition ft_strdup.c:23
void handle_local_vars(t_ms_data *data, char *arg)
char * expand_variable(char **start, t_ms_data *data)
char * ev_loop(char **start, t_ms_data *data, char *str_start, char *expanded_str)
t_env * shell_variables
Definition shell.h:25
char * str_start_adj(char *arg)
char * expand_env_and_loc_var(char *arg, t_ms_data *data)