From b0821cff553581d6499f5e542cd795f20c3e9bc7 Mon Sep 17 00:00:00 2001 From: Kp Date: Fri, 22 Jul 2016 02:25:17 +0000 Subject: [PATCH] Fix inverted sense of -use_players_dir Fixes: 4d483ca88f6f27589b287c23d03626dc2d0426c5 ("Simplify use of SysUsePlayersDir") --- common/include/args.h | 4 ++-- similar/main/inferno.cpp | 15 +++++++++------ similar/misc/args.cpp | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/common/include/args.h b/common/include/args.h index e00c8eb31..d57e422f3 100644 --- a/common/include/args.h +++ b/common/include/args.h @@ -74,7 +74,7 @@ struct CArg : prohibit_void_ptr #endif bool SysShowCmdHelp; bool SysLowMem; - uint8_t SysUsePlayersDir; + int8_t SysUsePlayersDir; bool SysAutoRecordDemo; bool SysWindow; bool SysAutoDemo; @@ -162,7 +162,7 @@ __attribute_format_arg(1) static inline const char *PLAYER_DIRECTORY_STRING(const char *s); static inline const char *PLAYER_DIRECTORY_STRING(const char *s) { - return &s[CGameArg.SysUsePlayersDir]; + return &s[CGameArg.SysUsePlayersDir + sizeof(PLAYER_DIRECTORY_TEXT) - 1]; } #define PLAYER_DIRECTORY_STRING(S) ((PLAYER_DIRECTORY_STRING)(PLAYER_DIRECTORY_TEXT S)) } diff --git a/similar/main/inferno.cpp b/similar/main/inferno.cpp index b6d0f158c..878ca0d76 100644 --- a/similar/main/inferno.cpp +++ b/similar/main/inferno.cpp @@ -536,17 +536,22 @@ static int main(int argc, char *argv[]) { char filename[sizeof(PLAYER_DIRECTORY_TEXT) + CALLSIGN_LEN + 4]; + /* Step over the literal PLAYER_DIRECTORY_TEXT when it is + * present. Point at &filename[0] when + * PLAYER_DIRECTORY_TEXT is absent. + */ + const auto b = &filename[-CGameArg.SysUsePlayersDir]; snprintf(filename, sizeof(filename), PLAYER_DIRECTORY_STRING("%.12s"), CGameArg.SysPilot.c_str()); /* The pilot name is never used after this. Clear it to * free the allocated memory, if any. */ CGameArg.SysPilot.clear(); - const uintptr_t SysUsePlayersDir = CGameArg.SysUsePlayersDir; - auto j = SysUsePlayersDir; - for (const auto &facet = std::use_facet>(std::locale::classic()); char &c = filename[j]; ++j) + auto p = b; + for (const auto &facet = std::use_facet>(std::locale::classic()); char &c = *p; ++p) { c = facet.tolower(static_cast(c)); } + auto j = p - filename; if (j < sizeof(filename) - 4 && (j <= 4 || strcmp(&filename[j - 4], ".plr"))) // if player hasn't specified .plr extension in argument, add it { strcpy(&filename[j], ".plr"); @@ -554,9 +559,7 @@ static int main(int argc, char *argv[]) } if(PHYSFSX_exists(filename,0)) { - filename[j - 4] = 0; - const auto b = &filename[SysUsePlayersDir]; - get_local_player().callsign.copy(b, std::distance(b, end(filename))); + get_local_player().callsign.copy(b, std::distance(b, &filename[j - 4])); read_player_file(); WriteConfigFile(); } diff --git a/similar/misc/args.cpp b/similar/misc/args.cpp index b743c13df..f57359f29 100644 --- a/similar/misc/args.cpp +++ b/similar/misc/args.cpp @@ -218,7 +218,7 @@ static void ReadCmdArgs(Inilist &ini, Arglist &Args) #endif } else if (!d_stricmp(p, "-use_players_dir")) - CGameArg.SysUsePlayersDir = sizeof(PLAYER_DIRECTORY_TEXT) - 1; + CGameArg.SysUsePlayersDir = static_cast(- (sizeof(PLAYER_DIRECTORY_TEXT) - 1)); else if (!d_stricmp(p, "-lowmem")) CGameArg.SysLowMem = true; else if (!d_stricmp(p, "-pilot"))