1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
#pragma once
namespace nall {
auto activepath() -> string {
char path[PATH_MAX] = "";
auto unused = getcwd(path, PATH_MAX);
string result = path;
if(!result) result = ".";
result.transform("\\", "/");
if(result.endsWith("/") == false) result.append("/");
return result;
}
auto realpath(rstring name) -> string {
string result;
char path[PATH_MAX] = "";
if(::realpath(name, path)) result = pathname(string{path}.transform("\\", "/"));
if(!result) return activepath();
result.transform("\\", "/");
if(result.endsWith("/") == false) result.append("/");
return result;
}
auto programpath() -> string {
#if defined(PLATFORM_WINDOWS)
wchar_t path[PATH_MAX] = L"";
GetModuleFileName(nullptr, path, PATH_MAX);
string result = (const char*)utf8_t(path);
result.transform("\\", "/");
return realpath(result);
#else
Dl_info info;
dladdr((void*)&programpath, &info);
return realpath(info.dli_fname);
#endif
}
// /
// c:/
auto rootpath() -> string {
#if defined(PLATFORM_WINDOWS)
wchar_t path[PATH_MAX] = L"";
SHGetFolderPathW(nullptr, CSIDL_WINDOWS | CSIDL_FLAG_CREATE, nullptr, 0, path);
string result = (const char*)utf8_t(path);
result.transform("\\", "/");
return slice(result, 0, 3);
#else
return "/";
#endif
}
// /home/username/
// c:/users/username/
auto userpath() -> string {
#if defined(PLATFORM_WINDOWS)
wchar_t path[PATH_MAX] = L"";
SHGetFolderPathW(nullptr, CSIDL_PROFILE | CSIDL_FLAG_CREATE, nullptr, 0, path);
string result = (const char*)utf8_t(path);
result.transform("\\", "/");
#else
struct passwd* userinfo = getpwuid(getuid());
string result = userinfo->pw_dir;
#endif
if(!result) result = ".";
if(result.endsWith("/") == false) result.append("/");
return result;
}
// /home/username/.config/
// c:/users/username/appdata/roaming/
auto configpath() -> string {
#if defined(PLATFORM_WINDOWS)
wchar_t path[PATH_MAX] = L"";
SHGetFolderPathW(nullptr, CSIDL_APPDATA | CSIDL_FLAG_CREATE, nullptr, 0, path);
string result = (const char*)utf8_t(path);
result.transform("\\", "/");
#elif defined(PLATFORM_MACOSX)
string result = {userpath(), "Library/Application Support/"};
#else
string result;
const char *env = getenv("XDG_CONFIG_HOME");
if(env) {
result.append(env);
} else {
result = {userpath(), ".config/"};
}
#endif
if(!result) result = ".";
if(result.endsWith("/") == false) result.append("/");
return result;
}
// /home/username/.local/share/
// c:/users/username/appdata/local/
auto localpath() -> string {
#if defined(PLATFORM_WINDOWS)
wchar_t path[PATH_MAX] = L"";
SHGetFolderPathW(nullptr, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, nullptr, 0, path);
string result = (const char*)utf8_t(path);
result.transform("\\", "/");
#elif defined(PLATFORM_MACOSX)
string result = {userpath(), "Library/Application Support/"};
#else
string result = {userpath(), ".local/share/"};
#endif
if(!result) result = ".";
if(result.endsWith("/") == false) result.append("/");
return result;
}
// /usr/share
// /Library/Application Support/
// c:/ProgramData/
auto sharedpath() -> string {
#if defined(PLATFORM_WINDOWS)
wchar_t path[PATH_MAX] = L"";
SHGetFolderPathW(nullptr, CSIDL_COMMON_APPDATA | CSIDL_FLAG_CREATE, nullptr, 0, path);
string result = (const char*)utf8_t(path);
result.transform("\\", "/");
#elif defined(PLATFORM_MACOSX)
string result = "/Library/Application Support/";
#else
string result = "/usr/share/";
#endif
if(!result) result = ".";
if(result.endsWith("/") == false) result.append("/");
return result;
}
// /tmp
// c:/users/username/AppData/Local/Temp/
auto temppath() -> string {
#if defined(PLATFORM_WINDOWS)
wchar_t path[PATH_MAX] = L"";
GetTempPathW(PATH_MAX, path);
string result = (const char*)utf8_t(path);
result.transform("\\", "/");
#elif defined(P_tmpdir)
string result = P_tmpdir;
#else
string result = "/tmp/";
#endif
if(result.endsWith("/") == false) result.append("/");
return result;
}
}
|