/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* env_fill.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cchauvet exit_code_str != NULL) free(data->exit_code_str); str = ft_itoa(data->exit_code); if (str == NULL) { ft_printf("minishell: malloc failed"); return (1); } data->exit_code_str = str; return (0); } static char *ft_get_value(t_data *data, char *key) { char *value; if (key[0] == '\0') return ("$"); if (ft_strcmp("?", key) == 0) return (data->exit_code_str); value = get_value_by_key(key, data->env); if (value == NULL) value = ""; return (value); } static char *ft_get_key(char *str) { char *key; size_t i; i = 1; if (ft_strncmp(str, "$$", 2) == 0) { key = ft_strdup("$"); if (key == NULL) ft_eprintf("minishell: malloc failed\n"); return (key); } if (str[i] == ' ' || str[i] == '\0') { key = ft_strdup(""); if (key == NULL) ft_eprintf("minishell: malloc failed\n"); return (key); } if (str[i] == '?') { key = ft_strdup("?"); if (key == NULL) ft_eprintf("minishell: malloc failed\n"); return (key); } while (str[i] != '\0' && str[i] != '$' && str[i] != ' ' && str[i] != '"') i++; key = ft_strndup(str + 1, i - 1); if (key == NULL) ft_eprintf("minishell: malloc failed\n"); return (key); } char *ft_env_filler(t_data *data, const char *str) { size_t i; char *key; char *out; char *temp; char *value; out = ft_strdup(str); if (out == NULL) { ft_eprintf("minishell: malloc failed\n"); return (NULL); } i = 0; while (out[i] != '\0') { while (ft_is_in_quote(out, i) == 1) i++; while (out[i] == '$') { key = ft_get_key(out + i); if (key == NULL) { free(out); return (NULL); } value = ft_get_value(data, key); if (value == NULL) { free(key); free(out); return (NULL); } temp = ft_strreplace(out, value, i, ft_strlen(key) + 1 + i); free(key); i = i + ft_strlen(value); free(out); if (temp == NULL) { ft_eprintf("minishell: malloc failed\n"); return (NULL); } out = temp; } if (out[i] != '\0') i++; } return (out); }