unix.c
changeset 193 0a7025304867
parent 179 003096efeb9d
child 206 7f8c26d8526b
equal deleted inserted replaced
192:614bba52258d 193:0a7025304867
    42 	const FiosItem *db = (const FiosItem *) b;
    42 	const FiosItem *db = (const FiosItem *) b;
    43 	int r;
    43 	int r;
    44 
    44 
    45 	if (_savegame_sort_order < 2) // sort by date
    45 	if (_savegame_sort_order < 2) // sort by date
    46     r = da->mtime < db->mtime ? -1 : 1;
    46     r = da->mtime < db->mtime ? -1 : 1;
    47 	else	
    47 	else
    48 		r = strcmp(da->title[0] ? da->title : da->name, db->title[0] ? db->title : db->name);
    48 		r = strcmp(da->title[0] ? da->title : da->name, db->title[0] ? db->title : db->name);
    49 
    49 
    50 	if (_savegame_sort_order & 1) r = -r;
    50 	if (_savegame_sort_order & 1) r = -r;
    51 	return r;
    51 	return r;
    52 }
    52 }
    69 
    69 
    70 	if(_game_mode==GM_EDITOR)
    70 	if(_game_mode==GM_EDITOR)
    71 		_fios_path = _fios_scn_path;
    71 		_fios_path = _fios_scn_path;
    72 	else
    72 	else
    73 		_fios_path = _fios_save_path;
    73 		_fios_path = _fios_save_path;
    74 	
    74 
    75 	// Parent directory, only if not in root already.
    75 	// Parent directory, only if not in root already.
    76 	if (_fios_path[1] != 0) {
    76 	if (_fios_path[1] != 0) {
    77 		fios = FiosAlloc();
    77 		fios = FiosAlloc();
    78 		fios->type = FIOS_TYPE_PARENT;
    78 		fios->type = FIOS_TYPE_PARENT;
    79 		fios->mtime = 0;
    79 		fios->mtime = 0;
   261 		return str_buffr;
   261 		return str_buffr;
   262 
   262 
   263 	case FIOS_TYPE_OLDFILE:
   263 	case FIOS_TYPE_OLDFILE:
   264 		sprintf(str_buffr, "%s/%s.%s", _fios_path, item->name, _old_extensions[item->old_extension]);
   264 		sprintf(str_buffr, "%s/%s.%s", _fios_path, item->name, _old_extensions[item->old_extension]);
   265 		return str_buffr;
   265 		return str_buffr;
   266 	
   266 
   267 	case FIOS_TYPE_SCENARIO:
   267 	case FIOS_TYPE_SCENARIO:
   268 		sprintf(str_buffr, "%s/%s.scn", path, item->name);
   268 		sprintf(str_buffr, "%s/%s.scn", path, item->name);
   269 		return str_buffr;
   269 		return str_buffr;
   270 	
   270 
   271 	case FIOS_TYPE_OLD_SCENARIO:
   271 	case FIOS_TYPE_OLD_SCENARIO:
   272 		sprintf(str_buffr, "%s/%s.%s", path, item->name, _old_extensions[item->old_extension]);
   272 		sprintf(str_buffr, "%s/%s.%s", path, item->name, _old_extensions[item->old_extension]);
   273 		return str_buffr;
   273 		return str_buffr;
   274 	}
   274 	}
   275 
   275 
   289 
   289 
   290 	if (statvfs(*path, &s) == 0)
   290 	if (statvfs(*path, &s) == 0)
   291 	{
   291 	{
   292 		uint64 tot = (uint64)s.f_bsize * s.f_bavail;
   292 		uint64 tot = (uint64)s.f_bsize * s.f_bavail;
   293 		SET_DPARAM32(0, (uint32)(tot >> 20));
   293 		SET_DPARAM32(0, (uint32)(tot >> 20));
   294 		return STR_4005_BYTES_FREE; 
   294 		return STR_4005_BYTES_FREE;
   295 	}
   295 	}
   296 	else
   296 	else
   297 		return STR_4006_UNABLE_TO_READ_DRIVE;
   297 		return STR_4006_UNABLE_TO_READ_DRIVE;
   298 	}
   298 	}
   299 #else
   299 #else
   300 	SET_DPARAM32(0, 0);
   300 	SET_DPARAM32(0, 0);
   301 	return STR_4005_BYTES_FREE; 
   301 	return STR_4005_BYTES_FREE;
   302 #endif
   302 #endif
   303 }
   303 }
   304 
   304 
   305 void FiosMakeSavegameName(char *buf, const char *name)
   305 void FiosMakeSavegameName(char *buf, const char *name)
   306 {
   306 {
   346 	{"extmidi",	"External MIDI Driver",	&_extmidi_music_driver,	EXTMIDI_PRI},
   346 	{"extmidi",	"External MIDI Driver",	&_extmidi_music_driver,	EXTMIDI_PRI},
   347 #endif
   347 #endif
   348 #endif
   348 #endif
   349 #ifdef __BEOS__
   349 #ifdef __BEOS__
   350 	{ "bemidi",	"BeOS MIDI Driver",			&_bemidi_music_driver,	1},
   350 	{ "bemidi",	"BeOS MIDI Driver",			&_bemidi_music_driver,	1},
   351 #endif	
   351 #endif
   352 	{   "null",	"Null Music Driver",		&_null_music_driver,		1},
   352 	{   "null",	"Null Music Driver",		&_null_music_driver,		1},
   353 	{     NULL,	NULL,										NULL,										0}
   353 	{     NULL,	NULL,										NULL,										0}
   354 };
   354 };
   355 
   355 
   356 bool FileExists(const char *filename)
   356 bool FileExists(const char *filename)
   357 {
   357 {
   358 	return access(filename, 0) == 0;	
   358 	return access(filename, 0) == 0;
   359 }
   359 }
   360 
   360 
   361 static int LanguageCompareFunc(const void *a, const void *b)
   361 static int LanguageCompareFunc(const void *a, const void *b)
   362 {
   362 {
   363 	return strcmp(*(char**)a, *(char**)b);
   363 	return strcmp(*(char**)a, *(char**)b);
   378 				if (num == max) break;
   378 				if (num == max) break;
   379 			}
   379 			}
   380 		}
   380 		}
   381 		closedir(dir);
   381 		closedir(dir);
   382 	}
   382 	}
   383 	
   383 
   384 	qsort(languages, num, sizeof(char*), LanguageCompareFunc);
   384 	qsort(languages, num, sizeof(char*), LanguageCompareFunc);
   385 	return num;
   385 	return num;
   386 }
   386 }
   387 
   387 
   388 void ChangeWorkingDirectory(char *exe)
   388 void ChangeWorkingDirectory(char *exe)
   401 }
   401 }
   402 
   402 
   403 void ShowOSErrorBox(const char *buf)
   403 void ShowOSErrorBox(const char *buf)
   404 {
   404 {
   405 	fprintf(stderr, "\033[1;31mError: %s\033[0;39m\n", buf);
   405 	fprintf(stderr, "\033[1;31mError: %s\033[0;39m\n", buf);
   406 	
   406 
   407 #if defined(__APPLE__)
   407 #if defined(__APPLE__)
   408 	// this opens the crash log opener script
   408 	// this opens the crash log opener script
   409 	system("./Crash_Log_Opener.app");
   409 	system("./Crash_Log_Opener.app");
   410 #endif
   410 #endif
   411 }
   411 }
   433 	_path.game_data_dir = malloc( MAX_PATH );
   433 	_path.game_data_dir = malloc( MAX_PATH );
   434 	strcpy(_path.game_data_dir, GAME_DATA_DIR);
   434 	strcpy(_path.game_data_dir, GAME_DATA_DIR);
   435 
   435 
   436 #if defined(USE_HOMEDIR)
   436 #if defined(USE_HOMEDIR)
   437 	{
   437 	{
   438 		char *homedir; 
   438 		char *homedir;
   439 		homedir = getenv("HOME");
   439 		homedir = getenv("HOME");
   440 		
   440 
   441 		if(!homedir) {
   441 		if(!homedir) {
   442 			struct passwd *pw = getpwuid(getuid());
   442 			struct passwd *pw = getpwuid(getuid());
   443 			if (pw) homedir = pw->pw_dir;
   443 			if (pw) homedir = pw->pw_dir;
   444 		}
   444 		}
   445 		
   445 
   446 		_path.personal_dir = str_fmt("%s" PATHSEP "%s", homedir, PERSONAL_DIR);
   446 		_path.personal_dir = str_fmt("%s" PATHSEP "%s", homedir, PERSONAL_DIR);
   447 	}
   447 	}
   448 	
   448 
   449 #else /* not defined(USE_HOMEDIR) */
   449 #else /* not defined(USE_HOMEDIR) */
   450 
   450 
   451 	_path.personal_dir = malloc( MAX_PATH );
   451 	_path.personal_dir = malloc( MAX_PATH );
   452 	strcpy(_path.personal_dir, PERSONAL_DIR);
   452 	strcpy(_path.personal_dir, PERSONAL_DIR);
   453 	
   453 
   454 	// check if absolute or relative path
   454 	// check if absolute or relative path
   455 	s = strchr(_path.personal_dir, '/');
   455 	s = strchr(_path.personal_dir, '/');
   456 	
   456 
   457 	// add absolute path
   457 	// add absolute path
   458 	if (s==NULL || _path.personal_dir != s) {
   458 	if (s==NULL || _path.personal_dir != s) {
   459 		getcwd(_path.personal_dir, MAX_PATH);
   459 		getcwd(_path.personal_dir, MAX_PATH);
   460 		s = strchr(_path.personal_dir, 0);
   460 		s = strchr(_path.personal_dir, 0);
   461 		*s++ = '/';
   461 		*s++ = '/';
   462 		strcpy(s, PERSONAL_DIR);
   462 		strcpy(s, PERSONAL_DIR);
   463 	}
   463 	}
   464 	
   464 
   465 #endif /* defined(USE_HOMEDIR) */
   465 #endif /* defined(USE_HOMEDIR) */
   466 
   466 
   467 	s = strchr(_path.personal_dir, 0);
   467 	s = strchr(_path.personal_dir, 0);
   468 	
   468 
   469 	// append a / ?
   469 	// append a / ?
   470 	if (s[-1] != '/') { s[0] = '/'; s[1] = 0; }
   470 	if (s[-1] != '/') { s[0] = '/'; s[1] = 0; }
   471 	
   471 
   472 	_path.save_dir = str_fmt("%ssave", _path.personal_dir);
   472 	_path.save_dir = str_fmt("%ssave", _path.personal_dir);
   473 	_path.autosave_dir = str_fmt("%s/autosave", _path.save_dir);
   473 	_path.autosave_dir = str_fmt("%s/autosave", _path.save_dir);
   474 	_path.scenario_dir = str_fmt("%sscenario", _path.personal_dir);
   474 	_path.scenario_dir = str_fmt("%sscenario", _path.personal_dir);
   475 	_path.gm_dir = str_fmt("%sgm/", _path.game_data_dir);
   475 	_path.gm_dir = str_fmt("%sgm/", _path.game_data_dir);
   476 	_path.data_dir = str_fmt("%sdata/", _path.game_data_dir);
   476 	_path.data_dir = str_fmt("%sdata/", _path.game_data_dir);
   477 	_path.lang_dir = str_fmt("%slang/", _path.game_data_dir);
   477 	_path.lang_dir = str_fmt("%slang/", _path.game_data_dir);
   478 	
   478 
   479 	_config_file = str_fmt("%sopenttd.cfg", _path.personal_dir);
   479 	_config_file = str_fmt("%sopenttd.cfg", _path.personal_dir);
   480 	
   480 
   481 	// make (auto)save and scenario folder
   481 	// make (auto)save and scenario folder
   482 	mkdir(_path.save_dir, 0755);
   482 	mkdir(_path.save_dir, 0755);
   483 	mkdir(_path.autosave_dir, 0755);
   483 	mkdir(_path.autosave_dir, 0755);
   484 	mkdir(_path.scenario_dir, 0755);
   484 	mkdir(_path.scenario_dir, 0755);
   485 }
   485 }