diff options
Diffstat (limited to 'src/env.c')
| -rw-r--r-- | src/env.c | 129 |
1 files changed, 66 insertions, 63 deletions
@@ -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); } |
