|
@@ -16,7 +16,8 @@
|
|
|
#endif // !BX_CRT_NONE
|
|
#endif // !BX_CRT_NONE
|
|
|
|
|
|
|
|
#if BX_PLATFORM_WINDOWS
|
|
#if BX_PLATFORM_WINDOWS
|
|
|
-extern "C" __declspec(dllimport) unsigned long __stdcall GetTempPathA(unsigned long _max, char* _ptr);
|
|
|
|
|
|
|
+extern "C" __declspec(dllimport) unsigned long __stdcall GetModuleFileNameA(void* _module, char* _outFilePath, unsigned long _size);
|
|
|
|
|
+extern "C" __declspec(dllimport) unsigned long __stdcall GetTempPathA(unsigned long _max, char* _outFilePath);
|
|
|
#endif // BX_PLATFORM_WINDOWS
|
|
#endif // BX_PLATFORM_WINDOWS
|
|
|
|
|
|
|
|
namespace bx
|
|
namespace bx
|
|
@@ -180,7 +181,7 @@ namespace bx
|
|
|
return ::_getcwd(_buffer, (int32_t)_size);
|
|
return ::_getcwd(_buffer, (int32_t)_size);
|
|
|
#else
|
|
#else
|
|
|
return ::getcwd(_buffer, _size);
|
|
return ::getcwd(_buffer, _size);
|
|
|
-#endif // BX_COMPILER_
|
|
|
|
|
|
|
+#endif // BX_PLATFORM_*
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static bool getCurrentPath(char* _out, uint32_t* _inOutSize)
|
|
static bool getCurrentPath(char* _out, uint32_t* _inOutSize)
|
|
@@ -195,6 +196,29 @@ namespace bx
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ static bool getExecutablePath(char* _out, uint32_t* _inOutSize)
|
|
|
|
|
+ {
|
|
|
|
|
+#if BX_PLATFORM_WINDOWS
|
|
|
|
|
+ uint32_t len = ::GetModuleFileNameA(NULL, _out, *_inOutSize);
|
|
|
|
|
+ bool result = len != 0 && len < *_inOutSize;
|
|
|
|
|
+ *_inOutSize = len;
|
|
|
|
|
+ return result;
|
|
|
|
|
+#elif BX_PLATFORM_LINUX
|
|
|
|
|
+ char tmp[64];
|
|
|
|
|
+ snprintf(tmp, sizeof(tmp), "/proc/%d/exe", getpid() );
|
|
|
|
|
+ ssize_t result = readlink(tmp, _out, *_inOutSize);
|
|
|
|
|
+
|
|
|
|
|
+ if (-1 < result)
|
|
|
|
|
+ {
|
|
|
|
|
+ *_inOutSize = uint32_t(result);
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+#elif BX_PLATFORM_OSX
|
|
|
|
|
+#endif // BX_PLATFORM_*
|
|
|
|
|
+
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
static bool getHomePath(char* _out, uint32_t* _inOutSize)
|
|
static bool getHomePath(char* _out, uint32_t* _inOutSize)
|
|
|
{
|
|
{
|
|
|
return false
|
|
return false
|
|
@@ -287,28 +311,22 @@ namespace bx
|
|
|
|
|
|
|
|
void FilePath::set(Dir::Enum _dir)
|
|
void FilePath::set(Dir::Enum _dir)
|
|
|
{
|
|
{
|
|
|
|
|
+ bool ok = false;
|
|
|
char tmp[kMaxFilePath];
|
|
char tmp[kMaxFilePath];
|
|
|
uint32_t len = BX_COUNTOF(tmp);
|
|
uint32_t len = BX_COUNTOF(tmp);
|
|
|
|
|
|
|
|
switch (_dir)
|
|
switch (_dir)
|
|
|
{
|
|
{
|
|
|
- case Dir::Current:
|
|
|
|
|
- getCurrentPath(tmp, &len);
|
|
|
|
|
- break;
|
|
|
|
|
-
|
|
|
|
|
- case Dir::Temp:
|
|
|
|
|
- getTempPath(tmp, &len);
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ case Dir::Current: ok = getCurrentPath(tmp, &len); break;
|
|
|
|
|
+ case Dir::Executable: ok = getExecutablePath(tmp, &len); break;
|
|
|
|
|
+ case Dir::Home: ok = getHomePath(tmp, &len); break;
|
|
|
|
|
+ case Dir::Temp: ok = getTempPath(tmp, &len); break;
|
|
|
|
|
|
|
|
- case Dir::Home:
|
|
|
|
|
- getHomePath(tmp, &len);
|
|
|
|
|
- break;
|
|
|
|
|
-
|
|
|
|
|
- default:
|
|
|
|
|
- len = 0;
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ default: break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ len = ok ? len : 0;
|
|
|
|
|
+
|
|
|
set(StringView(tmp, len) );
|
|
set(StringView(tmp, len) );
|
|
|
}
|
|
}
|
|
|
|
|
|