/* // Original Basis resolv_path.c was from Huthar // This version totally rewritten by Zak, 921201. // Zak, 930105: changed so will resolv even if user unknown... // Added cur = "cwd", idea from Pallando. */ // // Usage: resolv_path( cur, new ) // cur - current dir, or "cwd" // new - dest dir, resolvs .., ., "here", and ~ // varargs string resolv_path(string cur, string newvalue) { string *path, *tmp; int pos, i; if (cur == "cwd") if (this_player()) // idea from Pallando cur = (string) this_player()->query("cwd"); else cur = ""; // to fall thru below if (!cur || cur == "") cur = "/"; if (!newvalue || newvalue == "" || newvalue == ".") return cur; if (this_player() && (newvalue == "here" || newvalue == "env")) if (environment(this_player())) return file_name(environment(this_player())) + ".c"; else return "NONAME.c"; if (newvalue == "/") return newvalue; if (cur == "/" || newvalue[0] == '/') path = ({ }); else path = explode(cur, "/"); tmp = explode(newvalue, "/"); if(!tmp || !sizeof(tmp)) return "/"; if (tmp[0][0] == '~') { string home, hdir; if (tmp[0] == "~" && this_player()) home = (string)this_player()->query("name"); else home = extract(tmp[0], 1); if (home) { string hpath; hpath = user_path(home); if (this_player() && (hdir = (string)this_player()->query("home_dir"))) hpath = hdir; if(hpath[strlen(hpath)-1] != '/') hpath += "/"; #if 0 // newvalue method if (file_size(hpath) != -2) write("Unknown user: "+home+"\n"); #endif path = explode(hpath, "/"); } tmp -= ({ tmp[0] }); } pos = sizeof(path); for(i = 0; i < sizeof(tmp); i++) { if (!tmp[i] || tmp[i] == "" || tmp[i] == ".") continue; if (tmp[i] == "..") { pos--; if (pos<0) pos = 0; continue; } if (pos >= sizeof(path)) path += ({ tmp[i] }); else path[pos] = tmp[i]; pos++; } return ( "/" + implode(path[0..pos - 1], "/" )); } /* resolv_path */