diff --git a/src/env/env.c b/src/env/env.c new file mode 100644 index 0000000..d935374 --- /dev/null +++ b/src/env/env.c @@ -0,0 +1,121 @@ +#include "env.h" +#include "../../lib/bozolib/bozolib.h" +#include +#include +#include + +void env_del(void *ptr) +{ + env* content; + + content = ptr; + free(content->key); + free(content->value); + free(content); +} + +static env* create_env_content(const char *key, const char *value) +{ + env* out; + char *key_dup; + char *value_dup; + + out = malloc(sizeof(env)); + if (out == NULL) + return (NULL); + key_dup = strdup(key); + if (key_dup == NULL) + { + free(out); + return (NULL); + } + value_dup = strdup(value); + if (value_dup == NULL) + { + free(key_dup); + free(out); + return (NULL); + } + out->key = key_dup; + out->value = value_dup; + return (out); +} + +static lst* create_env(const char* key, const char* value) +{ + lst* out = malloc(sizeof(lst)); + if (out == NULL) + return (NULL); + out->content = create_env_content(key, value); + if (out->content == NULL) + { + free(out); + return (NULL); + } + out->next = NULL; + return (out); +} + +int add_env_variable(lst** root, const char* key, const char *value) +{ + lst* element; + + element = create_env(key, value); + if (element == NULL) + return 1; + lst_addback(root, element); + return 0; +} + +lst** env_init(const char** env) +{ + lst** root; + char* equal; + char* key; + char* value; + + root = malloc(sizeof(lst*)); + if (root == NULL) + return (NULL); + *root = NULL; + for (size_t i = 0; env[i] != NULL; i++) + { + equal = strchr(env[i], '='); + key = strndup(env[i], equal - env[i]); + if (key == NULL) + { + lst_clear(root, &env_del); + return (NULL); + } + value = strdup(env[i] + (equal - env[i]) + 1); + if (value == NULL) + { + lst_clear(root, &env_del); + free(key); + return (NULL); + } + if (add_env_variable(root, key, value)) + { + lst_clear(root, &env_del); + free(value); + free(key); + return (NULL); + } + } + return (root); +} + +char *get_env_variable(lst** root, char* key) +{ + lst* current = *root; + env *content; + + while (current != NULL) + { + content = current->content; + if (strcmp(content->key, key) == 0) + return (content->value); + current = current->next; + } + return (NULL); +} diff --git a/src/env/env.h b/src/env/env.h index 5a3d963..728f92c 100644 --- a/src/env/env.h +++ b/src/env/env.h @@ -1,7 +1,12 @@ #pragma once +#include "../../lib/bozolib/bozolib.h" typedef struct s_env { char *key; char *value; } env; + +int add_env_variable(lst** root, const char *key, const char *value); +lst** env_init(const char **env); +void env_del(void *ptr);