maxishell
Implementation of a shell for Linux-like systems
Loading...
Searching...
No Matches
env.c
Go to the documentation of this file.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* env.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: dmdemirk <dmdemirk@student.42london.c +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2024/06/07 17:20:11 by dmdemirk #+# #+# */
9/* Updated: 2024/09/09 13:08:55 by dmdemirk ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13#include "env.h"
14#include "libft.h"
15#include <stdlib.h>
16#include <stdio.h>
17
18void init_env(t_env **data_envp, char **envp);
19void add_env_node(t_env **data_envp, char *line);
20char *get_env(t_env *envp, const char *key);
21void set_env(t_env **env, const char *key, const char *value);
22int unset_env(t_env **env, const char *name);
23
24void init_env(t_env **data_envp, char **envp)
25{
26 int i;
27
28 i = -1;
29 while (envp[++i])
30 add_env_node(data_envp, envp[i]);
31}
32
33void add_env_node(t_env **data_envp, char *line)
34{
35 t_env *new_node;
36 char *eq_pos;
37 t_env *curr;
38
39 new_node = malloc(sizeof(t_env));
40 if (!new_node)
41 return ;
42 eq_pos = ft_strchr(line, '=');
43 if (!eq_pos)
44 return ;
45 new_node->key = ft_strndup(line, eq_pos - line);
46 new_node->value = ft_strdup(eq_pos + 1);
47 new_node->next = NULL;
48 if (!*data_envp)
49 *data_envp = new_node;
50 else
51 {
52 curr = *data_envp;
53 while (curr->next)
54 curr = curr->next;
55 curr->next = new_node;
56 }
57}
58
59char *get_env(t_env *envp, const char *key)
60{
61 t_env *curr_node;
62
63 curr_node = envp;
64 while (curr_node)
65 {
66 if (ft_strcmp(curr_node->key, key) == 0)
67 return (curr_node->value);
68 curr_node = curr_node->next;
69 }
70 return (NULL);
71}
72
73void set_env(t_env **env, const char *key, const char *value)
74{
75 t_env *current;
76 t_env *new_env;
77
78 current = *env;
79 while (current)
80 {
81 if (ft_strcmp(current->key, key) == 0)
82 {
83 free(current->value);
84 current->value = ft_strdup(value);
85 return ;
86 }
87 current = current->next;
88 }
89 new_env = malloc(sizeof(t_env));
90 new_env->key = ft_strdup(key);
91 new_env->value = ft_strdup(value);
92 new_env->next = *env;
93 *env = new_env;
94}
95
96int unset_env(t_env **env, const char *key)
97{
98 t_env *current;
99 t_env *prev;
100
101 current = *env;
102 prev = NULL;
103 while (current)
104 {
105 if (ft_strcmp(current->key, key) == 0)
106 {
107 if (prev)
108 prev->next = current->next;
109 else
110 *env = current->next;
111 free(current->key);
112 free(current->value);
113 free(current);
114 return (0);
115 }
116 prev = current;
117 current = current->next;
118 }
119 return (-1);
120}
int unset_env(t_env **env, const char *name)
Definition env.c:96
void set_env(t_env **env, const char *key, const char *value)
Definition env.c:73
void init_env(t_env **data_envp, char **envp)
Definition env.c:24
char * get_env(t_env *envp, const char *key)
Definition env.c:59
void add_env_node(t_env **data_envp, char *line)
Definition env.c:33
int ft_strcmp(const char *s1, const char *s2)
Definition ft_strcmp.c:24
char * ft_strndup(const char *s, size_t n)
Definition ft_strndup.c:23
char * ft_strchr(const char *s, int c)
Definition ft_strchr.c:25
char * ft_strdup(const char *s)
Definition ft_strdup.c:23
Definition env.h:17
struct s_env * next
Definition env.h:20
char * key
Definition env.h:18
char * value
Definition env.h:19