Files
eepp/src/utils/utils.cpp
spartanj 39312a23dd Optimized tSoundManager.
Added tSoundLoader, a template used for the ResourceLoader.
Fixed PushText on the Console.
Added loading from memory on shaders.
Added FileExtension to get file extension.
Added to Packs ExtractToFile and Add using pointers instead of std::vectors ( to give flexibility ).
And fixed some minor bugs.
2010-07-30 00:59:49 -03:00

372 lines
8.6 KiB
C++
Executable File

#include "utils.hpp"
#include "string.hpp"
#if EE_PLATFORM == EE_PLATFORM_APPLE
#include <CoreFoundation/CoreFoundation.h>
#include <sys/sysctl.h>
#elif EE_PLATFORM == EE_PLATFORM_WIN32
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#elif EE_PLATFORM == EE_PLATFORM_LINUX
#include <libgen.h>
#include <unistd.h>
#endif
#if EE_PLATFORM == EE_PLATFORM_WIN32
#include <direct.h>
#else
#include <sys/stat.h>
#endif
#if EE_PLATFORM == EE_PLATFORM_WIN32
#include <sys/utime.h>
#else
#include <sys/time.h>
#endif
#ifndef EE_COMPILER_MSVC
#include <dirent.h>
#endif
namespace EE { namespace Utils {
bool FileExists(const std::string& filepath) {
std::fstream fs;
fs.open( filepath.c_str(), std::ios::in );
if( fs.is_open() ) {
fs.close();
return true;
}
return false;
}
Uint32 eeGetTicks() {
return SDL_GetTicks();
}
void eeSleep( const Uint32& ms ) {
SDL_Delay(ms);
}
std::string AppPath() {
#if EE_PLATFORM == EE_PLATFORM_APPLE
char exe_file[PATH_MAX + 1];
CFBundleRef mainBundle = CFBundleGetMainBundle();
if (mainBundle) {
CFURLRef mainURL = CFBundleCopyBundleURL(mainBundle);
if (mainURL) {
int ok = CFURLGetFileSystemRepresentation ( mainURL, (Boolean) true, (UInt8*)exe_file, PATH_MAX );
if (ok) {
return std::string(exe_file) + "/";
}
}
}
throw CL_Error("get_exe_path failed");
#elif EE_PLATFORM == EE_PLATFORM_LINUX
char exe_file[PATH_MAX + 1];
int size;
size = readlink("/proc/self/exe", exe_file, PATH_MAX);
if (size < 0) {
return "";
} else {
exe_file[size] = '\0';
return std::string(dirname(exe_file)) + "/";
}
#elif EE_PLATFORM == EE_PLATFORM_WIN32
#ifdef UNICODE
// Get path to executable:
char szDrive[_MAX_DRIVE];
char szDir[_MAX_DIR];
char szFilename[_MAX_DIR];
char szExt[_MAX_DIR];
std::wstring dllName( _MAX_DIR, 0 );
GetModuleFileName(0, &dllName[0], _MAX_PATH);
std::string dllstrName( wstringTostring( dllName ) );
#ifdef EE_COMPILER_MSVC
_splitpath_s( dllstrName.c_str(), szDrive, _MAX_DRIVE, szDir, _MAX_DIR, szFilename, _MAX_DIR, szExt, _MAX_DIR );
#else
_splitpath(szDllName, szDrive, szDir, szFilename, szExt);
#endif
return std::string( szDrive ) + std::string( szDir );
#else
// Get path to executable:
TCHAR szDllName[_MAX_PATH];
TCHAR szDrive[_MAX_DRIVE];
TCHAR szDir[_MAX_DIR];
TCHAR szFilename[_MAX_DIR];
TCHAR szExt[_MAX_DIR];
GetModuleFileName(0, szDllName, _MAX_PATH);
#ifdef EE_COMPILER_MSVC
_splitpath_s(szDllName, szDrive, _MAX_DRIVE, szDir, _MAX_DIR, szFilename, _MAX_DIR, szExt, _MAX_DIR );
#else
_splitpath(szDllName, szDrive, szDir, szFilename, szExt);
#endif
return std::string(szDrive) + std::string(szDir);
#endif
#endif
}
std::vector<std::string> FilesGetInPath( const std::string& path ) {
std::vector<std::string> files;
#ifdef EE_COMPILER_MSVC
#ifdef UNICODE
std::wstring mPath( stringTowstring( path ) );
if ( mPath[ mPath.size() - 1 ] == L'/' || mPath[ mPath.size() - 1 ] == L'\\' ) {
mPath += L"*";
} else {
mPath += L"\\*";
}
WIN32_FIND_DATA findFileData;
HANDLE hFind = FindFirstFile( mPath.c_str(), &findFileData );
if( hFind != INVALID_HANDLE_VALUE ) {
std::wstring tmpstr( findFileData.cFileName );
if ( tmpstr != L"." && tmpstr != L".." )
files.push_back( wstringTostring( tmpstr ) );
while( FindNextFile(hFind, &findFileData ) ) {
tmpstr = std::wstring( findFileData.cFileName );
if ( tmpstr != L"." && tmpstr != L".." )
files.push_back( std::string( wstringTostring( findFileData.cFileName ) ) );
}
FindClose( hFind );
}
#else
std::string mPath( path );
if ( mPath[ mPath.size() - 1 ] == '/' || mPath[ mPath.size() - 1 ] == '\\' ) {
mPath += "*";
} else {
mPath += "\\*";
}
WIN32_FIND_DATA findFileData;
HANDLE hFind = FindFirstFile( (LPCTSTR) mPath.c_str(), &findFileData );
if( hFind != INVALID_HANDLE_VALUE ) {
std::string tmpstr( findFileData.cFileName );
if ( tmpstr != "." && tmpstr != ".." )
files.push_back( tmpstr );
while( FindNextFile(hFind, &findFileData ) ) {
tmpstr = std::string( findFileData.cFileName );
if ( tmpstr != "." && tmpstr != ".." )
files.push_back( std::string( findFileData.cFileName ) );
}
FindClose( hFind );
}
#endif
return files;
#else
DIR *dp;
struct dirent *dirp;
if( ( dp = opendir( path.c_str() ) ) == NULL)
return files;
while ( ( dirp = readdir(dp) ) != NULL) {
if ( strcmp( dirp->d_name, ".." ) != 0 && strcmp( dirp->d_name, "." ) != 0 )
files.push_back( std::string( dirp->d_name ) );
}
closedir(dp);
return files;
#endif
}
Uint32 FileSize( const std::string& Filepath ) {
std::ifstream f;
f.open(Filepath.c_str(), std::ios_base::binary | std::ios_base::in);
if (!f.good() || f.eof() || !f.is_open()) { return 0; }
f.seekg(0, std::ios_base::beg);
std::ifstream::pos_type begin_pos = f.tellg();
f.seekg(0, std::ios_base::end);
return static_cast<Uint32>(f.tellg() - begin_pos);
}
eeDouble GetSystemTime() {
#if EE_PLATFORM == EE_PLATFORM_WIN32
static LARGE_INTEGER Frequency;
static BOOL UseHighPerformanceTimer = QueryPerformanceFrequency(&Frequency);
if (UseHighPerformanceTimer) {
// High performance counter available : use it
LARGE_INTEGER CurrentTime;
QueryPerformanceCounter(&CurrentTime);
return static_cast<double>(CurrentTime.QuadPart) / Frequency.QuadPart;
} else
// High performance counter not available : use GetTickCount (less accurate)
return GetTickCount() * 0.001;
#else
timeval Time = {0, 0};
gettimeofday(&Time, NULL);
return Time.tv_sec + Time.tv_usec / 1000000.;
#endif
}
bool IsDirectory( const std::string& path ) {
#ifndef EE_COMPILER_MSVC
DIR *dp;
bool isdir = !( ( dp = opendir( path.c_str() ) ) == NULL);
closedir(dp);
return isdir;
#else
return GetFileAttributes( (LPCTSTR) path.c_str() ) != INVALID_FILE_ATTRIBUTES;
#endif
}
bool MakeDir( const std::string& path, const Uint16& mode ) {
Int16 v;
#if EE_PLATFORM == EE_PLATFORM_WIN32
#ifdef EE_COMPILER_MSVC
v = _mkdir( path.c_str() );
#else
v = mkdir( path.c_str() );
#endif
#else
v = mkdir( path.c_str(), mode );
#endif
return v == 0;
}
std::string GetWindowsPath() {
#if EE_PLATFORM == EE_PLATFORM_WIN32
#ifdef UNICODE
wchar_t Buffer[1024];
GetWindowsDirectory( Buffer, 1024 );
return wstringTostring( std::wstring( Buffer ) );
#else
char Buffer[1024];
GetWindowsDirectory( Buffer, 1024 );
return std::string( Buffer );
#endif
#else
return std::string( "/usr/bin/" ); // :P
#endif
}
Uint32 MakeHash( const std::wstring& str ) {
return MakeHash( reinterpret_cast<const Int8*>( &str[0] ) );
}
Uint32 MakeHash( const std::string& str ) {
return MakeHash( reinterpret_cast<const Int8*>( &str[0] ) );
}
Uint32 MakeHash( const Int8* str ) {
if ( NULL != str ) {
Uint32 hash = 5381 + *str;
while( *str ) {
hash = *str + ( hash << 6 ) + ( hash << 16 ) - hash;
str++;
}
hash += *( str - 1 );
return hash;
}
return 0;
}
bool FileGet( const std::string& path, std::vector<Uint8>& data ) {
if ( FileExists( path ) ) {
std::fstream fs ( path.c_str() , std::ios::in | std::ios::binary );
Uint32 fsize = FileSize( path );
data.clear();
data.resize( fsize );
fs.read( reinterpret_cast<char*> (&data[0]), fsize );
fs.close();
return true;
}
return false;
}
bool FileCopy( const std::string& src, const std::string& dst ) {
if ( FileExists( src ) ) {
ifstream in( src.c_str() );
ofstream out( dst.c_str() );
if ( in.is_open() && out.is_open() ) {
out << in.rdbuf();
in.close();
out.close();
return true;
}
}
return false;
}
std::string FileExtension( const std::string& filepath ) {
std::string tstr( filepath.substr( filepath.find_last_of(".") + 1 ) );
toLower( tstr );
return tstr;
}
eeInt GetNumCPUs() {
eeInt nprocs = -1;
#if EE_PLATFORM == EE_PLATFORM_WIN32
SYSTEM_INFO info;
GetSystemInfo(&info);
nprocs = (eeInt) info.dwNumberOfProcessors;
#elif EE_PLATFORM == EE_PLATFORM_LINUX
nprocs = sysconf(_SC_NPROCESSORS_ONLN);
#elif EE_PLATFORM == EE_PLATFORM_APPLE
int mib[2];
size_t len;
int maxproc = 1;
mib[0] = CTL_HW;
mib[1] = HW_NCPU;
len = sizeof(maxproc);
// sysctl != 0 == error
if ( sysctl(mib, 2, &maxproc, &len, NULL, NULL == -1) )
return 1;
nprocs = maxproc;
#else
#warning GetNumCPUs not implemented for this platform
#endif
if ( nprocs < 0 )
nprocs = 1;
return nprocs;
}
}}