#include #include #include #include extern char** environ; int starts_with(char* haystack, char* needle) { return !strncmp(haystack, needle, strlen(needle)); } int fail() { printf("\\w"); return 1; } /* sometimes there are characters before /home/ that can be completely ignored */ int fix_home(char* in_path) { if (starts_with(in_path, "/d4m/home/")) return sizeof("/d4m") - 1; if (starts_with(in_path, "/nfs/emc5/home/")) return sizeof("/nfs/emc5") - 1; return 0; } int main(int argc, char** argv) { char in_path_arr[2048]; char out_path[2048]; char cur_env_name[2048]; char best_env_name[2048]; int best_env_index = -1; int best_env_name_match_amt = 0; int index_of_equals; char* cur_env_value; int e_idx, idx_c; char* cur_e; char* in_path; if (!getcwd(in_path_arr, sizeof(in_path_arr))) return fail(); in_path = in_path_arr + fix_home(in_path_arr); for(e_idx = 0; cur_e = environ[e_idx] ; e_idx++) { for(idx_c = 0 ; cur_e[idx_c] && cur_e[idx_c] != '=' && idx_c < sizeof(cur_env_name)-1; idx_c++) cur_env_name[idx_c] = cur_e[idx_c]; cur_env_name[idx_c] = 0; if (cur_e[idx_c] != '=') continue; else index_of_equals = idx_c; cur_env_value = cur_e + index_of_equals + 1; if (cur_env_value[0] == '/' && strlen(cur_env_value) > best_env_name_match_amt && starts_with(in_path, cur_env_value) && strcmp("PWD", cur_env_name) && strcmp("OLDPWD", cur_env_name) && strcmp("HOME", cur_env_name)) { strncpy(best_env_name, cur_env_name, sizeof(best_env_name)); best_env_name[sizeof(best_env_name)-1] = 0; best_env_index = e_idx; best_env_name_match_amt = strlen(cur_env_value); } } if (!best_env_name_match_amt || !(strlen(best_env_name)+1