char * msys2_get_relocated_path_list(char const * paths) { char win_part[MAX_PATH]; get_executable_path (NULL, &win_part[0], MAX_PATH); strip_n_suffix_folders (&win_part[0], 2); /* 2 because the file name is present. */ char **arr = NULL; size_t count = split_path_list(paths, ':', &arr); int result_size = 1 + (count - 1); /* count - 1 is for ; delim. */ size_t i; for (i = 0; i < count; ++i) { arr[i] = (char *) strip_n_prefix_folders (arr[i], 1); result_size += strlen (arr[i]) + strlen (win_part); } char * result = (char *) malloc (result_size); if (result == NULL) { return NULL; } result[0] = '\0'; for (i = 0; i < count; ++i) { strcat (result, win_part); strcat (result, arr[i]); if (i != count-1) { strcat (result, ";"); } } free ((void*)arr); return result; }
void update_path_env(int force) { if(path_env_was_changed(force)) { append_scripts_dirs(); split_path_list(); } }
char * get_relocated_path_list(char const * from, char const * to_path_list) { char exe_path[MAX_PATH]; char * temp; get_executable_path (NULL, &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0])); if ((temp = strrchr (exe_path, '/')) != NULL) { temp[1] = '\0'; } char **arr = NULL; /* Ask Alexey why he added this. Are we not 100% sure that we're dealing with unix paths here? */ char split_char = ':'; if (strchr (to_path_list, ';')) { split_char = ';'; } size_t count = split_path_list (to_path_list, split_char, &arr); int result_size = 1 + (count - 1); /* count - 1 is for ; delim. */ size_t exe_path_size = strlen (exe_path); size_t i; /* Space required is: count * (exe_path_size + strlen (rel_to_datadir)) rel_to_datadir upper bound is: (count * strlen (from)) + (3 * num_slashes (from)) + strlen(arr[i]) + 1. .. pathalogically num_slashes (from) is strlen (from) (from = ////////) */ size_t space_required = (count * (exe_path_size + 4 * strlen (from))) + count - 1; for (i = 0; i < count; ++i) { space_required += strlen (arr[i]); } char * scratch = (char *) alloca (space_required); if (scratch == NULL) return NULL; for (i = 0; i < count; ++i) { char * rel_to_datadir = get_relative_path (from, arr[i]); scratch[0] = '\0'; arr[i] = scratch; strcat (scratch, exe_path); strcat (scratch, rel_to_datadir); simplify_path (arr[i]); size_t arr_i_size = strlen (arr[i]); result_size += arr_i_size; scratch = arr[i] + arr_i_size + 1; } char * result = (char *) malloc (result_size); if (result == NULL) { return NULL; } result[0] = '\0'; for (i = 0; i < count; ++i) { strcat (result, arr[i]); if (i != count-1) { #if defined(_WIN32) strcat (result, ";"); #else strcat (result, ":"); #endif } } free ((void*)arr); return result; }