diff --git a/env.c b/env.c new file mode 100644 index 0000000..3fb243c --- /dev/null +++ b/env.c @@ -0,0 +1,242 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* env.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: erey-bet +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/02 14:39:56 by erey-bet #+# #+# */ +/* Updated: 2023/02/16 15:13:35 by cchauvet ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int get_index(char *s, char c) +{ + int i; + + i = -1; + while (s[++i]) + if (s[i] == c) + return (i); + return (-1); +} + +void print_export(t_list **head, int fd) +{ + t_list *current; + + current = *head; + while (current->next != NULL) + { + write(fd, "declare -x ", 11); + ft_putstr_fd(((t_env*)(current->content))->key, fd); + ft_putstr_fd("=", fd); + write(fd, "\"", 1); + ft_putstr_fd(((t_env*)(current->content))->value, fd); + write(fd, "\"\n", 2); + current = current->next; + } +} + +void print_env(t_list **head, int fd) +{ + t_list *current; + + current = *head; + while (current->next != NULL) + { + ft_putstr_fd(((t_env*)(current->content))->key, fd); + ft_putstr_fd("=", fd); + ft_putstr_fd(((t_env*)(current->content))->value, fd); + write(fd, "\n", 1); + current = current->next; + } +} + +int strcmp_alphabet(char *s1, char *s2) +{ + int i; + + if (!s1 || !s2) + return (-2); + i = 0; + while (s1[i] && s2[i]) + { + if (s1[i] < s2[i]) + return (0); + else if (s1[i] > s2[i]) + return (1); + i++; + } + return (-1); +} + +void ft_double_swap(void *a, void *b) +{ + void *c; + + c = a; + a = b; + b = c; +} + +void exchange(void *a, void *b, void *c) +{ + void *d; + + d = a; + a = b; + b = c; + c = d; +} + +char *get_value(char *str) +{ + char *s; + int i; + int start; + + s = ft_calloc(ft_strlen(str), sizeof(char)); + start = get_index(str, '='); + i = start; + while (str[++i]) + s[i - start - 1] = str[i]; + return (s); +} + +void env_del(void *ptr) +{ + t_env *content; + + content = ptr; + free(content->key); + free(content->value); +} + +char *get_key(char *str) +{ + char *s; + int i; + + s = ft_calloc(ft_strlen(str), sizeof(char)); + i = -1; + while (str[++i] != '=') + s[i] = str[i]; + return (s); +} + +void swap_env_3(void **a, void **b, void **c) +{ + void *d; + + d = *a; + *a = *b; + *b = *c; + *c = d; +} + +void swap_env(void **a, void **b) +{ + void *c; + + c = *a; + *a = *b; + *b = c; +} + +void add_sort(t_list **head, t_env *var) +{ + t_list *current; + t_env *last; + + current = *head; + while (current->next != NULL && strcmp_alphabet(var->key, ((t_env*)(current->content))->key) != 0) + current = current->next; + if (current->content == NULL) + current->content = var; + else + { + last = NULL; + swap_env_3((void **)&last, ¤t->content, (void **)&var); + while (current->next != NULL) + { + current = current->next; + swap_env(¤t->content, (void **)&last); + } + } + if (current->next == NULL) + current->next = ft_calloc(1, sizeof(t_list)); +} + +char *get_value_by_key(char *key, t_list **head) +{ + t_list *current; + + current = *head; + while (current->next != NULL) + { + if (ft_strcmp(((t_env *)current->content)->key, key) == 0) + return (((t_env *)current->content)->value); + current = current->next; + } + return (NULL); +} + +int set_value_by_key(char *key, char *value, t_list **head) +{ + t_list *current; + + current = *head; + while (current->next != NULL) + { + if (ft_strcmp(((t_env *)current->content)->key, key) == 0) + { + free(((t_env *)current->content)->value); + ((t_env *)current->content)->value = value; + return (0); + } + current = current->next; + } + return (1); +} + +int create_value_by_key(char *key, char *value, t_list **head) +{ + t_env *content; + if (set_value_by_key(key, value, head) == 0) + return (0); + content = ft_calloc(1, sizeof(t_env)); + if (content == NULL) + return (1); + content->key = key; + content->value = value; + add_sort(head, content); + return (0); +} + +t_list **init_env(char **env) +{ + t_list **head; + int i; + t_env *var; + + head = ft_calloc(1, sizeof(t_list *)); + if (head == NULL) + return (NULL); + *head = ft_calloc(1, sizeof(t_list)); + if (*head == NULL) + return (NULL); + i = -1; + while (env[++i]) + { + var = ft_calloc(1, sizeof(t_env)); + if (var == NULL) + return (NULL); + var->key = get_key(env[i]); + var->value = get_value(env[i]); + add_sort(head, var); + } + return (head); +} diff --git a/minishell.h b/minishell.h index 99fa3fc..123558d 100644 --- a/minishell.h +++ b/minishell.h @@ -6,7 +6,7 @@ /* By: cchauvet