222 char *FioGetFullPath(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir, const char *filename) |
222 char *FioGetFullPath(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir, const char *filename) |
223 { |
223 { |
224 assert(subdir < NUM_SUBDIRS); |
224 assert(subdir < NUM_SUBDIRS); |
225 assert(sp < NUM_SEARCHPATHS); |
225 assert(sp < NUM_SEARCHPATHS); |
226 |
226 |
227 snprintf(buf, buflen, "%s%s" PATHSEP "%s", _searchpaths[sp], _subdirs[subdir], filename); |
227 snprintf(buf, buflen, "%s%s%s", _searchpaths[sp], _subdirs[subdir], filename); |
228 return buf; |
228 return buf; |
229 } |
229 } |
230 |
230 |
231 char *FioFindFullPath(char *buf, size_t buflen, Subdirectory subdir, const char *filename) |
231 char *FioFindFullPath(char *buf, size_t buflen, Subdirectory subdir, const char *filename) |
232 { |
232 { |
462 DetermineBasePaths(exe); |
462 DetermineBasePaths(exe); |
463 |
463 |
464 Searchpath sp; |
464 Searchpath sp; |
465 FOR_ALL_SEARCHPATHS(sp) DEBUG(misc, 4, "%s added as search path", _searchpaths[sp]); |
465 FOR_ALL_SEARCHPATHS(sp) DEBUG(misc, 4, "%s added as search path", _searchpaths[sp]); |
466 |
466 |
467 /* Search for the first search path, as that will be the closest to |
467 if (_config_file != NULL) { |
468 * the personal directory. */ |
468 _personal_dir = strdup(_config_file); |
469 FOR_ALL_SEARCHPATHS(sp) { |
469 char *end = strrchr(_personal_dir , PATHSEPCHAR); |
470 _personal_dir = strdup(_searchpaths[sp]); |
470 if (end == NULL) { |
471 DEBUG(misc, 3, "%s found as personal directory", _searchpaths[sp]); |
471 _personal_dir[0] = '\0'; |
472 break; |
472 } else { |
473 } |
473 end[1] = '\0'; |
474 |
474 } |
475 if (_config_file == NULL) { |
475 } else { |
476 _config_file = str_fmt("%sopenttd.cfg", _personal_dir); |
476 char personal_dir[MAX_PATH]; |
477 } |
477 FioFindFullPath(personal_dir, lengthof(personal_dir), BASE_DIR, "openttd.cfg"); |
|
478 |
|
479 if (FileExists(personal_dir)) { |
|
480 char *end = strrchr(personal_dir, PATHSEPCHAR); |
|
481 if (end != NULL) end[1] = '\0'; |
|
482 _personal_dir = strdup(personal_dir); |
|
483 _config_file = str_fmt("%sopenttd.cfg", _personal_dir); |
|
484 } else { |
|
485 static const Searchpath new_openttd_cfg_order[] = { |
|
486 SP_PERSONAL_DIR, SP_BINARY_DIR, SP_WORKING_DIR, SP_SHARED_DIR, SP_INSTALLATION_DIR |
|
487 }; |
|
488 |
|
489 for (uint i = 0; i < lengthof(new_openttd_cfg_order); i++) { |
|
490 if (IsValidSearchPath(new_openttd_cfg_order[i])) { |
|
491 _personal_dir = strdup(_searchpaths[new_openttd_cfg_order[i]]); |
|
492 _config_file = str_fmt("%sopenttd.cfg", _personal_dir); |
|
493 break; |
|
494 } |
|
495 } |
|
496 } |
|
497 } |
|
498 |
|
499 DEBUG(misc, 3, "%s found as personal directory", _personal_dir); |
478 |
500 |
479 _highscore_file = str_fmt("%shs.dat", _personal_dir); |
501 _highscore_file = str_fmt("%shs.dat", _personal_dir); |
480 _log_file = str_fmt("%sopenttd.log", _personal_dir); |
502 _log_file = str_fmt("%sopenttd.log", _personal_dir); |
481 |
503 |
482 char *save_dir = str_fmt("%s%s", _personal_dir, FioGetSubdirectory(SAVE_DIR)); |
504 char *save_dir = str_fmt("%s%s", _personal_dir, FioGetSubdirectory(SAVE_DIR)); |