|  |  | @ -160,6 +160,39 @@ | 
		
	
		
			
			|  |  |  | #define _POSIX_C_SOURCE 199309L // Required for: CLOCK_MONOTONIC if compiled with c99 without gnu ext. | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // platform specific defines to handle GetApplicationDirectory | 
		
	
		
			
			|  |  |  | #if defined (PLATFORM_DESKTOP) | 
		
	
		
			
			|  |  |  | #if defined(_WIN32) | 
		
	
		
			
			|  |  |  | #ifndef MAX_PATH | 
		
	
		
			
			|  |  |  | #define MAX_PATH 1025 | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | void* LoadLibraryA(void* lpLibFileName); | 
		
	
		
			
			|  |  |  | void* LoadLibraryW(void* lpLibFileName); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | #ifdef UNICODE | 
		
	
		
			
			|  |  |  | #define LoadLibrary  LoadLibraryW | 
		
	
		
			
			|  |  |  | #else | 
		
	
		
			
			|  |  |  | #define LoadLibrary  LoadLibraryA | 
		
	
		
			
			|  |  |  | #endif // !UNICODE | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | void* GetProcAddress(void* hModule, void* lpProcName); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | void* GetCurrentProcess(void); | 
		
	
		
			
			|  |  |  | bool FreeLibrary(void* hLibModule); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | int  WideCharToMultiByte(unsigned int cp, unsigned long flags, const unsigned short* widestr, int cchwide, char* str, int cbmb, const char* defchar, int* used_default); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | const char PathDelim = '\\'; | 
		
	
		
			
			|  |  |  | #elif defined(__linux__) | 
		
	
		
			
			|  |  |  | #include <unistd.h> | 
		
	
		
			
			|  |  |  | const char PathDelim = '/'; | 
		
	
		
			
			|  |  |  | #elif defined(__APPLE__) | 
		
	
		
			
			|  |  |  | #include <sys/syslimits.h> | 
		
	
		
			
			|  |  |  | const char PathDelim = '/'; | 
		
	
		
			
			|  |  |  | #endif // OSs | 
		
	
		
			
			|  |  |  | #endif // PLATFORM_DESKTOP | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | #include <stdlib.h>                 // Required for: srand(), rand(), atexit() | 
		
	
		
			
			|  |  |  | #include <stdio.h>                  // Required for: sprintf() [Used in OpenURL()] | 
		
	
		
			
			|  |  |  | #include <string.h>                 // Required for: strrchr(), strcmp(), strlen() | 
		
	
	
		
			
				|  |  | @ -2969,6 +3002,92 @@ const char *GetWorkingDirectory(void) | 
		
	
		
			
			|  |  |  | return path; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | const char* GetApplicationDirectory(void) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | static char appDir[MAX_FILEPATH_LENGTH] = { 0 }; | 
		
	
		
			
			|  |  |  | memset(appDir, 0, MAX_FILEPATH_LENGTH); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | #if defined(_WIN32) | 
		
	
		
			
			|  |  |  | typedef unsigned long(*GetModuleFileNameFunc)(void*, void*, void*, unsigned long); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | GetModuleFileNameFunc getModuleFileNameExWPtr = NULL; | 
		
	
		
			
			|  |  |  | void* lib = LoadLibrary(L"psapi.dll"); | 
		
	
		
			
			|  |  |  | if (lib == NULL) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | appDir[0] = '\\'; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | else | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | #if defined (UNICODE) | 
		
	
		
			
			|  |  |  | getModuleFileNameExWPtr = (GetModuleFileNameFunc)GetProcAddress(lib, "GetModuleFileNameExW"); | 
		
	
		
			
			|  |  |  | #else | 
		
	
		
			
			|  |  |  | getModuleFileNameExWPtr = (GetModuleFileNameFunc)GetProcAddress(lib, "GetModuleFileNameExA"); | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | if (getModuleFileNameExWPtr == NULL) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | appDir[0] = '\\'; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | else | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int len = 0; | 
		
	
		
			
			|  |  |  | #if defined (UNICODE) | 
		
	
		
			
			|  |  |  | unsigned short widePath[MAX_PATH]; | 
		
	
		
			
			|  |  |  | len = getModuleFileNameExWPtr(GetCurrentProcess(), NULL, widePath, MAX_PATH); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | len = WideCharToMultiByte(0, 0, widePath, len, appDir, MAX_PATH, NULL, NULL); | 
		
	
		
			
			|  |  |  | #else | 
		
	
		
			
			|  |  |  | len = getModuleFileNameExWPtr(GetCurrentProcess(), NULL, appDir, MAX_PATH); | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | if (len > 0) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | for (int i = len; i >= 0; --i) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (appDir[i] == '\\') | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | appDir[i + 1] = '\0'; | 
		
	
		
			
			|  |  |  | i = -1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | FreeLibrary(lib); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | #elif defined(__linux__) | 
		
	
		
			
			|  |  |  | unsigned int size = sizeof(appDir); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | ssize_t len = readlink("/proc/self/exe", appDir, size); | 
		
	
		
			
			|  |  |  | if (len > 0) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | for (int i = len; i >= 0; --i) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (appDir[i] == '/') | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | appDir[i + 1] = '\0'; | 
		
	
		
			
			|  |  |  | i = -1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | #elif defined(__APPLE__) | 
		
	
		
			
			|  |  |  | uint32_t size = sizeof(appDir); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | if (_NSGetExecutablePath(appDir, &size) == 0) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int len = strlen(appDir); | 
		
	
		
			
			|  |  |  | for (int i = len; i >= 0; --i) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (appDir[i] == '/') | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | appDir[i + 1] = '\0'; | 
		
	
		
			
			|  |  |  | i = -1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | return appDir; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Get filenames in a directory path | 
		
	
		
			
			|  |  |  | // NOTE: Files count is returned by parameters pointer | 
		
	
		
			
			|  |  |  | char **GetDirectoryFiles(const char *dirPath, int *fileCount) | 
		
	
	
		
			
				|  |  |  |