char *replace_env(char **env, char *cmd, int lret) { int size; char *str; size = replace_size_env(env, cmd, lret); size += replace_size_tilde(cmd, ft_getenv(env, "HOME")); str = ft_strnew(size + 1); size = 0; while (*cmd) { cmd = skip_quotes(cmd, &size); if (*cmd == '$') size += sub_replace_env(env, &cmd, &str[size], lret); else if (*cmd == '~') { size += replace_tilde(ft_getenv(env, "HOME"), &str[size]); cmd++; } else { str[size++] = *cmd; cmd++; } } str[size] = 0; return (str); }
char * expand_path(const char path[]) { char *const expanded_envvars = expand_envvars(path, 0); /* replace_tilde() frees memory pointed to by expand_envvars. */ return replace_tilde(expanded_envvars); }
void parse_args(t_all *all) { int i; i = 0; while (all->cmd.args[i]) { all->cmd.args[i] = replace_tilde(all, all->cmd.args[i]); all->cmd.args[i] = replace_var(all, all->cmd.args[i]); i++; } }
void check_tilde(t_lexer *node, char **env) { int i; char *str; i = 0; str = node->str; while (str[i]) { if (str[i] == '~' && (i == 0 || ft_isspace(str[i - 1]))) replace_tilde(node, env, i); i++; } }
/* Breaks PATH environment variable into list of paths. */ static void split_path_list(void) { const char *path, *p, *q; int i; path = env_get("PATH"); if(paths != NULL) free_string_array(paths, paths_count); paths_count = 1; p = path; while((p = strchr(p, ':')) != NULL) { paths_count++; p++; } paths = reallocarray(NULL, paths_count, sizeof(paths[0])); if(paths == NULL) { paths_count = 0; return; } i = 0; p = path - 1; do { int j; char *s; p++; #ifndef _WIN32 q = strchr(p, ':'); #else q = strchr(p, ';'); #endif if(q == NULL) { q = p + strlen(p); } s = malloc(q - p + 1U); if(s == NULL) { free_string_array(paths, i - 1); paths = NULL; paths_count = 0; return; } copy_str(s, q - p + 1U, p); p = q; s = replace_tilde(s); /* No need to check "." path for existence. */ if(strcmp(s, ".") != 0) { if(!path_exists(s, DEREF)) { free(s); continue; } } paths[i++] = s; for(j = 0; j < i - 1; j++) { if(stroscmp(paths[j], s) == 0) { free(s); i--; break; } } } while(q[0] != '\0'); paths_count = i; }