summaryrefslogtreecommitdiff
path: root/src/porting.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-01-07 19:39:27 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-01-07 19:39:27 +0200
commit6b6c2d37ea1f9075c4fbf0d7e2d52e527e1f86aa (patch)
tree16ab23387dc95d0f42e6519e500d4024e2a2f826 /src/porting.cpp
parentdc414091e736badc6fd2faa6a2583639a3458818 (diff)
downloadminetest-6b6c2d37ea1f9075c4fbf0d7e2d52e527e1f86aa.tar.gz
minetest-6b6c2d37ea1f9075c4fbf0d7e2d52e527e1f86aa.tar.bz2
minetest-6b6c2d37ea1f9075c4fbf0d7e2d52e527e1f86aa.zip
Added a more flexible path system (and fixed some minor stuff)
Diffstat (limited to 'src/porting.cpp')
-rw-r--r--src/porting.cpp160
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
+