maxishell
Implementation of a shell for Linux-like systems
Loading...
Searching...
No Matches
shell_variables.c
Go to the documentation of this file.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* shell_variables.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: dmdemirk <dmdemirk@student.42london.c +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2024/09/06 11:51:16 by dmdemirk #+# #+# */
9/* Updated: 2024/09/09 12:41:39 by dmdemirk ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13#include "shell.h"
14#include "env.h"
15#include "libft.h"
16#include "tokens.h"
17#include <stddef.h>
18
19int handle_add_set_shell_variable(t_env **shell_var, char *line);
20int handle_get_shell_variable(t_ms_data *data, const char *key);
21int handle_shell_variable(t_ast *node, t_ms_data *data);
22void shell_variable_update(t_ms_data *data, int status);
23
24int handle_add_set_shell_variable(t_env **shell_var, char *line)
25{
26 char *key;
27 char *value;
28 char *nq_value;
29
30 key = NULL;
31 value = NULL;
32 nq_value = NULL;
33 if (*shell_var == NULL)
34 add_shell_var_node(shell_var, line);
35 else
36 {
37 key = ft_strcdup(line, '=');
38 value = ft_strchr(line, '=') + 1;
39 nq_value = ft_remove_quotes(value, '\"');
40 set_shell_var(shell_var, key, nq_value);
41 free(nq_value);
42 free(key);
43 }
44 return (0);
45}
46
47int handle_get_shell_variable(t_ms_data *data, const char *key)
48{
49 char *value;
50 t_env *shell_var;
51
52 shell_var = data->shell_variables;
53 value = get_env(shell_var, key);
54 if (value)
55 {
56 ft_putstr_fd(value, data->std_out);
57 ft_putstr_fd("\n", data->std_out);
58 free(value);
59 return (0);
60 }
61 return (-1);
62}
63
65{
66 if (node->left && node->right == NULL)
67 return (handle_get_shell_variable(data, node->args[0]));
68 return (-1);
69}
70
71void shell_variable_update(t_ms_data *data, int status)
72{
73 char *status_str;
74
75 data->exit_status = status;
76 status_str = ft_itoa(status);
77 set_shell_var(&data->shell_variables, "?", status_str);
78 free(status_str);
79}
char * get_env(t_env *envp, const char *key)
Definition env.c:59
void set_shell_var(t_env **shell_var, const char *key, const char *value)
char * ft_strcdup(const char *s, int c)
Definition utils.c:52
void add_shell_var_node(t_env **shell_var, const char *line)
char * ft_itoa(int n)
Definition ft_itoa.c:40
char * ft_remove_quotes(char *str, char quote_type)
char * ft_strchr(const char *s, int c)
Definition ft_strchr.c:25
void ft_putstr_fd(char *s, int fd)
void shell_variable_update(t_ms_data *data, int status)
int handle_get_shell_variable(t_ms_data *data, const char *key)
int handle_shell_variable(t_ast *node, t_ms_data *data)
int handle_add_set_shell_variable(t_env **shell_var, char *line)
Definition tokens.h:50
char ** args
Definition tokens.h:52
struct s_ast * right
Definition tokens.h:54
struct s_ast * left
Definition tokens.h:53
Definition env.h:17
int exit_status
Definition shell.h:30
int std_out
Definition shell.h:27
t_env * shell_variables
Definition shell.h:25