」 feat(builtins/export): export possibly done

This commit is contained in:
yosyo
2024-07-11 19:08:49 +02:00
parent 54e01e9bc3
commit 310f26ef80
6 changed files with 135 additions and 42 deletions

View File

@ -3,10 +3,10 @@
/* ::: :::::::: */
/* builtins.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: adjoly <adjoly@student.42angouleme.fr> +#+ +:+ +#+ */
/* By: mmoussou <mmoussou@student.42angouleme.fr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/22 13:05:18 by adjoly #+# #+# */
/* Updated: 2024/06/29 19:39:01 by adjoly ### ########.fr */
/* Updated: 2024/07/11 19:00:04 by mmoussou ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,12 +18,18 @@
# define PATH_MAX_LEN 4096
void ft_pwd(void);
void ft_cd(t_env *env, char *args);
void ft_echo(char **args);
char *ret_cwd(void);
void ft_env(t_env *env);
void ft_unset(char *arg, t_env *env);
char **env_get_list(t_env *env);
void ft_export(char **args, t_env *env);
#endif

View File

@ -6,7 +6,7 @@
/* By: mmoussou <mmoussou@student.42angouleme.fr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/10/30 23:06:24 by mmoussou #+# #+# */
/* Updated: 2024/05/25 14:24:29 by adjoly ### ########.fr */
/* Updated: 2024/07/08 14:45:20 by mmoussou ### ########.fr */
/* */
/* ************************************************************************** */
@ -57,6 +57,7 @@ char *ft_ltoa(long long n);
/* STRINGS */
uint ft_strlen(char const *s);
uint ft_vstrlen(int len, ...);
char *ft_strchr(const char *s, int c);
char *ft_strrchr(const char *s, int c);
int ft_strcmp(const char *s1, const char *s2);

View File

@ -6,7 +6,7 @@
/* By: mmoussou <mmoussou@student.42angouleme.fr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/10/31 12:42:36 by mmoussou #+# #+# */
/* Updated: 2024/04/30 11:03:32 by mmoussou ### ########.fr */
/* Updated: 2024/07/11 15:25:29 by mmoussou ### ########.fr */
/* */
/* ************************************************************************** */
@ -14,10 +14,27 @@
uint ft_strlen(const char *s)
{
const char *endptr;
uint result;
endptr = s;
while (*endptr)
endptr++;
return (endptr - s);
result = 0;
if (!s)
return (0);
while (s[result])
result++;
return (result);
}
uint ft_vstrlen(int len, ...)
{
va_list argsl;
int total_len;
va_start(argsl, len);
total_len = 0;
while (len)
{
total_len += ft_strlen(va_arg(argsl, const char *));
len--;
}
return (total_len);
}

View File

@ -6,11 +6,12 @@
/* By: mmoussou <mmoussou@student.42angouleme.fr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/26 08:42:36 by mmoussou #+# #+# */
/* Updated: 2024/07/06 19:08:43 by mmoussou ### ########.fr */
/* Updated: 2024/07/11 19:07:01 by mmoussou ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
#include "builtins.h"
uint ft_arraylen(char **s)
{
@ -51,7 +52,7 @@ void env_print_in_order(t_env *env_l)
char **env;
int i;
env = env_get(env_l);
env = env_get_list(env_l);
if (!env)
return ;
ft_arraysort(env);
@ -64,11 +65,39 @@ void env_print_in_order(t_env *env_l)
return ;
}
void ft_export(char **args, t_env *env)
int export_value(char *arg, t_env *env)
{
char *name;
char *content;
if (!strchr(arg, '='))
{
name = ft_strdup(arg);
if (name)
ft_envadd_back(&env, ft_envnew(name, ft_calloc(1, 1)));
return (-1);
}
name = ft_calloc(sizeof(char), ft_strchr(arg, '=') - arg + 1);
content = ft_calloc(sizeof(char), ft_strlen(ft_strchr(arg, '=')));
if (!name || !content)
{
ft_free("cc", &name, &content);
return (-1);
}
ft_strlcpy(name, arg, ft_strchr(arg, '=') - arg + 1);
ft_strlcpy(content, ft_strchr(arg, '=') + 1,
ft_strlen(ft_strchr(arg, '=')) + 1);
if (env_get_value(name, env))
env_edit(name, content, env);
else
ft_envadd_back(&env, ft_envnew(name, content));
return (0);
}
void ft_export(char **args, t_env *env)
{
int status;
if (!args || !args[0])
{
env_print_in_order(env);
@ -76,22 +105,9 @@ void ft_export(char **args, t_env *env)
}
while (*args)
{
if (!strchr(*args, '='))
status = export_value(*args, env);
if (status)
return ;
name = ft_calloc(sizeof(char), ft_strchr(*args, '=') - *args + 1);
content = ft_calloc(sizeof(char), ft_strlen(ft_strchr(*args, '=')));
if (!name || !content)
{
ft_free("cc", &name, &content);
return ;
}
ft_strlcpy(name, *args, ft_strchr(*args, '=') - *args + 1);
ft_strlcpy(content, ft_strchr(*args, '=') + 1,
ft_strlen(ft_strchr(*args, '=')) + 1);
if (env_get_value(name, env))
env_edit(name, content, env);
else
ft_envadd_back(&env, ft_envnew(name, content));
args++;
}
}

View File

@ -0,0 +1,53 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_export_utils.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: mmoussou <mmoussou@student.42angouleme.fr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/07/11 18:59:27 by mmoussou #+# #+# */
/* Updated: 2024/07/11 18:59:42 by mmoussou ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
void env_make_str(char *str, char *name, char *content)
{
if (!content)
ft_strlcpy(str, name, ft_strlen(name) + 1);
else
{
ft_strlcpy(str, name, ft_strlen(name) + 1);
str[ft_strlen(name)] = '=';
ft_strlcat(str, content, ft_vstrlen(2, str, content) + 1);
}
}
char **env_get_list(t_env *env)
{
char **ar;
int i;
ar = ft_calloc(sizeof(char *), (ft_envsize(env) + 1));
if (!ar)
return (ar);
ar[ft_envsize(env)] = NULL;
i = 0;
while (env)
{
if (ft_strcmp(env->name, "_"))
{
ar[i] = ft_calloc(1, ft_vstrlen(2, env->name, env->content) + 2);
if (!ar[i])
{
ft_free("a", ar);
return (NULL);
}
env_make_str(ar[i], env->name, env->content);
i++;
}
env = env->next;
}
return (ar);
}

30
src/env/env_setters.c vendored
View File

@ -6,7 +6,7 @@
/* By: mmoussou <mmoussou@student.42angouleme.fr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/22 14:42:52 by mmoussou #+# #+# */
/* Updated: 2024/07/09 14:34:39 by mmoussou ### ########.fr */
/* Updated: 2024/07/11 17:46:56 by mmoussou ### ########.fr */
/* */
/* ************************************************************************** */
@ -76,29 +76,29 @@ t_env *env_init(char **env_d)
char **env_get(t_env *env)
{
char **exec_env;
char **ar;
int i;
exec_env = malloc(sizeof(char *) * (ft_envsize(env) + 1));
if (!exec_env)
return (exec_env);
exec_env[ft_envsize(env)] = NULL;
ar = ft_calloc(sizeof(char *), (ft_envsize(env) + 1));
if (!ar)
return (ar);
ar[ft_envsize(env)] = NULL;
i = 0;
while (env)
{
exec_env[i] = malloc(ft_strlen(env->name)
+ ft_strlen(env->content) + 2);
if (!exec_env[i])
if (!env->content)
continue ;
ar[i] = ft_calloc(1, ft_vstrlen(2, env->name, env->content) + 2);
if (!ar[i])
{
ft_free("a", exec_env);
ft_free("a", ar);
return (NULL);
}
ft_strlcpy(exec_env[i], env->name, ft_strlen(env->name) + 1);
exec_env[i][ft_strlen(env->name)] = '=';
ft_strlcpy(exec_env[i] + ft_strlen(env->name) + 1,
env->content, ft_strlen(env->content) + 1);
ft_strlcpy(ar[i], env->name, ft_strlen(env->name) + 1);
ar[i][ft_strlen(env->name)] = '=';
ft_strlcat(ar[i], env->content, ft_vstrlen(2, ar[i], env->content) + 1);
env = env->next;
i++;
}
return (exec_env);
return (ar);
}