aboutsummaryrefslogtreecommitdiff
path: root/src/env.c
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2020-09-15 17:54:48 +0200
committerCharles Cabergs <me@cacharle.xyz>2020-09-15 17:54:48 +0200
commitf626f2715ab696fdb326ed67256d012d86faef9f (patch)
treef25f2d95688a89c662622e3c2f11786f27689713 /src/env.c
parent170d0b74fa725196bca0fa549520d0d8bfa07576 (diff)
downloadminishell-f626f2715ab696fdb326ed67256d012d86faef9f.tar.gz
minishell-f626f2715ab696fdb326ed67256d012d86faef9f.tar.bz2
minishell-f626f2715ab696fdb326ed67256d012d86faef9f.zip
Refactoring env, Removing bloat from utils, exec and env
Diffstat (limited to 'src/env.c')
-rw-r--r--src/env.c129
1 files changed, 66 insertions, 63 deletions
diff --git a/src/env.c b/src/env.c
index 42339c8..0f84d44 100644
--- a/src/env.c
+++ b/src/env.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/28 09:21:24 by cacharle #+# #+# */
-/* Updated: 2020/09/14 16:00:15 by charles ### ########.fr */
+/* Updated: 2020/09/15 17:44:21 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -26,7 +26,7 @@
** \return Environment hash table or NULL on error
*/
-t_env env_from_array(char **envp)
+t_env env_from_array(char **envp)
{
t_env env;
@@ -44,62 +44,87 @@ t_env env_from_array(char **envp)
return (ft_vecpush(env, NULL));
}
-int env_keycmp(char *var, char *key)
-{
- size_t key_len;
-
- key_len = ft_strlen(key);
- if (ft_strncmp(var, key, key_len) == 0
- && ft_strlen(var) > key_len
- && var[key_len] == '=')
- return (0);
- return (1);
-}
-
-/**
-** \brief Search a key in environment
-** \param env Search environment
-** \param key Searched key
-** \return Value after '=' in environment variable array or NULL if not found
+/*
+** \brief Search a key in environment
+** \param env Searched environment
+** \param key Searched key
+** \param found_index If found_index != NULL and key is found
+** put the index in the env array of key in found_index
+** \return Value after '=' in environment variable array
+** or NULL if not found
*/
-char *env_search(t_env env, char *key)
+char *env_search(t_env env, char *key, size_t *found_index)
{
size_t i;
+ size_t key_len;
i = 0;
while (i < env->size - 1)
{
- if (env_keycmp(env->data[i], key) == 0)
+ key_len = ft_strlen(key);
+ if (ft_strncmp(env->data[i], key, key_len) == 0
+ && ft_strlen(env->data[i]) > key_len
+ && ((char**)env->data)[i][key_len] == '=')
+ {
+ if (found_index != NULL)
+ *found_index = i;
return (ft_strchr(env->data[i], '=') + 1);
+ }
i++;
}
return (NULL);
}
-int env_search_index(t_env env, char *key)
+/*
+** \brief Insert or update an environment variable
+** \param env Updated environment
+** \param key Name of the variable to update
+** \param value New value of the variable
+** \return The full variable (i.e `key=value`) or NULL on error
+*/
+
+char *env_export(t_env env, char *key, char *value)
{
- size_t i;
+ char *joined;
+ size_t found_index;
- i = 0;
- while (i < env->size - 1)
+ if ((joined = ft_strjoin3(key, "=", value)) == NULL)
+ return (NULL);
+ if (env_search(env, key, &found_index) == NULL)
{
- if (env_keycmp(env->data[i], key) == 0)
- return (i);
- i++;
+ if (ft_vecinsert(env, env->size - 1, joined) == NULL)
+ return (NULL);
+ }
+ else
+ {
+ free(env->data[found_index]);
+ env->data[found_index] = joined;
}
- return (-1);
+ return (joined);
}
+/*
+** \brief Buffer containning the string representation of the status code
+** and returned by env_search_first_match if asked for $?
+*/
+
static char g_status_buf[64] = {'\0'};
-char *env_search_first_match(t_env env, const char *haystack)
+/*
+** \brief Search the environment for a potential key located
+** at the start of haystack
+** \param haystack Potential key
+** \return The value assiciated with the key or NULL if not found
+*/
+
+char *env_search_first_match(t_env env, const char *haystack)
{
size_t len;
size_t i;
size_t key_len;
- if (!ft_isalnum(*haystack) && *haystack != '_' && *haystack != '?') // $ alone
+ if (!ft_isalnum(*haystack) && *haystack != '_' && *haystack != '?')
return ("$");
if (ft_isdigit(*haystack))
return (NULL);
@@ -122,38 +147,16 @@ char *env_search_first_match(t_env env, const char *haystack)
return (NULL);
}
-char *env_export(t_env env, char *key, char *value)
-{
- char *joined;
- int i;
-
- if ((joined = ft_strjoin3(key, "=", value)) == NULL)
- return (NULL);
- i = env_search_index(env, key);
- if (i == -1)
- {
- if (ft_vecinsert(env, env->size - 1, joined) == NULL)
- return (NULL);
- }
- else
- {
- free(env->data[i]);
- env->data[i] = joined;
- }
- return (joined);
-}
-
-char *env_export_full(t_env env, char *variable)
+size_t env_key_len(char *key, bool allow_status)
{
- char *key;
- char *value;
+ size_t i;
- key = variable;
- value = ft_strchr(variable, '=');
- if (value == NULL)
- return (NULL);
- *value = '\0';
- key = env_export(env, key, value + 1);
- *value = '=';
- return (key);
+ if (allow_status && *key == '?')
+ return (2);
+ if (ft_isdigit(*key))
+ return (0);
+ i = 0;
+ while (ft_isalnum(key[i]) || key[i] == '_')
+ i++;
+ return (i);
}