diff options
Diffstat (limited to 'src/porting.cpp')
-rw-r--r-- | src/porting.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/src/porting.cpp b/src/porting.cpp new file mode 100644 index 000000000..bff865c53 --- /dev/null +++ b/src/porting.cpp @@ -0,0 +1,160 @@ +/* +Minetest-c55 +Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com> + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +/* + Random portability stuff + + See comments in porting.h +*/ + +#include "porting.h" + +namespace porting +{ + +std::string path_data = "../data"; +std::string path_userdata = "../"; + +void pathRemoveFile(char *path, char delim) +{ + // Remove filename and path delimiter + int i; + for(i = strlen(path)-1; i>=0; i--) + { + if(path[i] == delim) + break; + } + path[i] = 0; +} + +void initializePaths() +{ +#ifdef RUN_IN_PLACE + /* + Use relative paths if RUN_IN_PLACE + */ + + dstream<<"Using relative paths (RUN_IN_PLACE)"<<std::endl; + + /* + Windows + */ + #if defined(_WIN32) + #include <windows.h> + + const DWORD buflen = 1000; + char buf[buflen]; + DWORD len; + + // Find path of executable and set path_data relative to it + len = GetModuleFileName(GetModuleHandle(NULL), buf, buflen); + assert(len < buflen); + pathRemoveFile(buf, '\\'); + + // Use "./bin/../data" + path_data = std::string(buf) + "/../data"; + + // Use "./bin/../" + path_userdata = std::string(buf) + "/../"; + + /* + Linux + */ + #elif defined(linux) + #include <unistd.h> + + char buf[BUFSIZ]; + // Get path to executable + readlink("/proc/self/exe", buf, BUFSIZ); + + pathRemoveFile(buf, '/'); + + // Use "./bin/../data" + path_data = std::string(buf) + "/../data"; + + // Use "./bin/../" + path_userdata = std::string(buf) + "/../"; + + /* + OS X + */ + #elif defined(__APPLE__) + + //TODO: Get path of executable. This assumes working directory is bin/ + dstream<<"WARNING: Relative path not properly supported on OS X" + <<std::endl; + path_data = std::string("../data"); + path_userdata = std::string("../"); + + #endif +#else + /* + Use platform-specific paths otherwise + */ + + dstream<<"Using system-wide paths (NOT RUN_IN_PLACE)"<<std::endl; + + /* + Windows + */ + #if defined(_WIN32) + #include <windows.h> + + const DWORD buflen = 1000; + char buf[buflen]; + DWORD len; + + // Find path of executable and set path_data relative to it + len = GetModuleFileName(GetModuleHandle(NULL), buf, buflen); + assert(len < buflen); + pathRemoveFile(buf, '\\'); + + // Use "./bin/../data" + path_data = std::string(buf) + "/../data"; + + // Use "C:\Documents and Settings\user\Application Data\<APPNAME>" + len = GetEnvironmentVariable("APPDATA", buf, buflen); + assert(len < buflen); + path_userdata = std::string(buf) + "/" + APPNAME; + + /* + Linux + */ + #elif defined(linux) + + path_userdata = std::string("~/.") + APPNAME; + path_data = std::string("/usr/share/") + APPNAME; + + /* + OS X + */ + #elif defined(__APPLE__) + + path_userdata = std::string("~/Library/Application Support/") + APPNAME; + path_data = std::string("minetest-mac.app/Contents/Resources/data/"); + + #endif +#endif + + dstream<<"path_data = "<<path_data<<std::endl; + dstream<<"path_userdata = "<<path_userdata<<std::endl; +} + +} //namespace porting + |