aboutsummaryrefslogtreecommitdiff
path: root/advtrains_signals_ks
diff options
context:
space:
mode:
authorBlockhead <jbis1337@hotmail.com>2021-01-18 15:27:50 +0100
committerorwell96 <orwell@bleipb.de>2021-01-18 15:27:50 +0100
commitb4c8de8695a53fc3348dffe93f40683cb6d63fa7 (patch)
tree93626dae1fc100b3aad19509f37c5a2317663071 /advtrains_signals_ks
parent7fa1a402bf098fa21fc0d32899885d1203e441b6 (diff)
downloadadvtrains-b4c8de8695a53fc3348dffe93f40683cb6d63fa7.tar.gz
advtrains-b4c8de8695a53fc3348dffe93f40683cb6d63fa7.tar.bz2
advtrains-b4c8de8695a53fc3348dffe93f40683cb6d63fa7.zip
Fix serialisation: breach of contract, file left open
Previous commit did not fix saving, but is kept because there is a corner case for which it is required (see MT forum)
Diffstat (limited to 'advtrains_signals_ks')
0 files changed, 0 insertions, 0 deletions
='n136' href='#n136'>136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
/*
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"
#include "config.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];
	memset(buf, 0, BUFSIZ);
	// Get path to executable
	readlink("/proc/self/exe", buf, BUFSIZ-1);
	
	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 // RUN_IN_PLACE

	/*
		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";
	//path_data = std::string(buf) + "/../share/" + APPNAME;
		
	// 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)
		#include <unistd.h>
	
	char buf[BUFSIZ];
	memset(buf, 0, BUFSIZ);
	// Get path to executable
	readlink("/proc/self/exe", buf, BUFSIZ-1);
	
	pathRemoveFile(buf, '/');

	path_data = std::string(buf) + "/../share/" + APPNAME;
	//path_data = std::string(INSTALL_PREFIX) + "/share/" + APPNAME;
	
	path_userdata = std::string(getenv("HOME")) + "/." + APPNAME;

	/*
		OS X
	*/
	#elif defined(__APPLE__)
		#include <unistd.h>