save commit
This commit is contained in:
171
minishell-codex/src/env/env.c
vendored
Normal file
171
minishell-codex/src/env/env.c
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
#include "minishell.h"
|
||||
|
||||
static t_env *env_new(const char *key, const char *value)
|
||||
{
|
||||
t_env *n = (t_env *)calloc(1, sizeof(t_env));
|
||||
if (!n)
|
||||
return NULL;
|
||||
n->key = ms_strdup(key);
|
||||
n->value = value ? ms_strdup(value) : ms_strdup("");
|
||||
if (!n->key || !n->value)
|
||||
{
|
||||
free(n->key);
|
||||
free(n->value);
|
||||
free(n);
|
||||
return NULL;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
void env_init(t_shell *sh, char **envp)
|
||||
{
|
||||
int i;
|
||||
char *eq;
|
||||
|
||||
sh->env = NULL;
|
||||
if (!envp)
|
||||
return;
|
||||
i = 0;
|
||||
while (envp[i])
|
||||
{
|
||||
eq = strchr(envp[i], '=');
|
||||
if (eq)
|
||||
{
|
||||
char *key = ms_strndup(envp[i], (size_t)(eq - envp[i]));
|
||||
char *val = ms_strdup(eq + 1);
|
||||
env_set(sh, key, val);
|
||||
free(key);
|
||||
free(val);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void env_clear(t_shell *sh)
|
||||
{
|
||||
t_env *cur = sh->env;
|
||||
t_env *next;
|
||||
|
||||
while (cur)
|
||||
{
|
||||
next = cur->next;
|
||||
free(cur->key);
|
||||
free(cur->value);
|
||||
free(cur);
|
||||
cur = next;
|
||||
}
|
||||
sh->env = NULL;
|
||||
}
|
||||
|
||||
char *env_get(t_shell *sh, const char *key)
|
||||
{
|
||||
t_env *cur = sh->env;
|
||||
|
||||
while (cur)
|
||||
{
|
||||
if (strcmp(cur->key, key) == 0)
|
||||
return cur->value;
|
||||
cur = cur->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int env_set(t_shell *sh, const char *key, const char *value)
|
||||
{
|
||||
t_env *cur = sh->env;
|
||||
t_env *prev = NULL;
|
||||
|
||||
while (cur)
|
||||
{
|
||||
if (strcmp(cur->key, key) == 0)
|
||||
{
|
||||
char *dup = ms_strdup(value ? value : "");
|
||||
if (!dup)
|
||||
return 1;
|
||||
free(cur->value);
|
||||
cur->value = dup;
|
||||
return 0;
|
||||
}
|
||||
prev = cur;
|
||||
cur = cur->next;
|
||||
}
|
||||
cur = env_new(key, value);
|
||||
if (!cur)
|
||||
return 1;
|
||||
if (prev)
|
||||
prev->next = cur;
|
||||
else
|
||||
sh->env = cur;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int env_unset(t_shell *sh, const char *key)
|
||||
{
|
||||
t_env *cur = sh->env;
|
||||
t_env *prev = NULL;
|
||||
|
||||
while (cur)
|
||||
{
|
||||
if (strcmp(cur->key, key) == 0)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = cur->next;
|
||||
else
|
||||
sh->env = cur->next;
|
||||
free(cur->key);
|
||||
free(cur->value);
|
||||
free(cur);
|
||||
return 0;
|
||||
}
|
||||
prev = cur;
|
||||
cur = cur->next;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
char **env_to_envp(t_shell *sh)
|
||||
{
|
||||
char **envp;
|
||||
int count = 0;
|
||||
t_env *cur = sh->env;
|
||||
int i = 0;
|
||||
|
||||
while (cur)
|
||||
{
|
||||
count++;
|
||||
cur = cur->next;
|
||||
}
|
||||
envp = (char **)calloc((size_t)count + 1, sizeof(char *));
|
||||
if (!envp)
|
||||
return NULL;
|
||||
cur = sh->env;
|
||||
while (cur)
|
||||
{
|
||||
char *kv = ms_strjoin3(cur->key, "=", cur->value);
|
||||
envp[i++] = kv;
|
||||
cur = cur->next;
|
||||
}
|
||||
envp[i] = NULL;
|
||||
return envp;
|
||||
}
|
||||
|
||||
void env_free_envp(char **envp)
|
||||
{
|
||||
int i = 0;
|
||||
if (!envp)
|
||||
return;
|
||||
while (envp[i])
|
||||
free(envp[i++]);
|
||||
free(envp);
|
||||
}
|
||||
|
||||
void env_print(t_shell *sh)
|
||||
{
|
||||
t_env *cur = sh->env;
|
||||
while (cur)
|
||||
{
|
||||
if (cur->value)
|
||||
printf("%s=%s\n", cur->key, cur->value);
|
||||
cur = cur->next;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user