From 712d790e009d3473b3c6f88a74aadbae18278dec Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sun, 12 Apr 2026 05:36:04 +0200 Subject: [PATCH 1/7] Changed separators from member variables to functions. --- Core/GameEngine/Include/Common/INI.h | 22 +++++++++------------- Core/GameEngine/Source/Common/INI/INI.cpp | 15 ++++----------- 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/Core/GameEngine/Include/Common/INI.h b/Core/GameEngine/Include/Common/INI.h index fd80031c0bc..1cf01644c5e 100644 --- a/Core/GameEngine/Include/Common/INI.h +++ b/Core/GameEngine/Include/Common/INI.h @@ -251,11 +251,12 @@ class INI AsciiString getFilename() const { return m_filename; } INILoadType getLoadType() const { return m_loadType; } UnsignedInt getLineNum() const { return m_lineNum; } - const char *getSeps() const { return m_seps; } - const char *getSepsPercent() const { return m_sepsPercent; } - const char *getSepsColon() const { return m_sepsColon; } - const char *getSepsQuote() { return m_sepsQuote; } Bool isEOF() const { return m_endOfFile; } + static const char *getSeps() { return " \n\r\t="; } ///< default delimiters for strtok parsing + static const char *getSepsPercent() { return " \n\r\t=%%"; } ///< default delimiters & percent delimiter + static const char *getSepsColon() { return " \n\r\t=:"; } ///< default delimiters & colon delimiter + static const char *getSepsQuote() { return "\"\n="; } ///< delimiters to represent a quoted ascii string + static const char *getEndToken() { return "End"; } ///< token to represent an end of data block void initFromINI( void *what, const FieldParse* parseTable ); void initFromINIMulti( void *what, const MultiIniFieldParse& parseTableList ); @@ -323,18 +324,18 @@ class INI /** - return the next token. if seps is null (or omitted), the standard seps are used. + return the next token. if seps is not specified, the standard seps are used. this will *never* return null; if there are no more tokens, an exception will be thrown. */ - const char* getNextToken(const char* seps = nullptr); + static const char* getNextToken(const char* seps = getSeps()); /** just like getNextToken(), except that null is returned if no more tokens are present (rather than throwing an exception). usually you should call getNextToken(), but for some cases this is handier (ie, parsing a variable-length number of tokens). */ - const char* getNextTokenOrNull(const char* seps = nullptr); + static const char* getNextTokenOrNull(const char* seps = getSeps()); /** This is called when the next thing you expect is something like: @@ -346,7 +347,7 @@ class INI If "Tag" is not the next token, an error is thrown. */ - const char* getNextSubToken(const char* expected); + static const char* getNextSubToken(const char* expected); /** return the next ascii string. this is usually the same the result of getNextToken(), @@ -403,11 +404,6 @@ class INI INILoadType m_loadType; ///< load time for current file UnsignedInt m_lineNum; ///< current line number that's been read char m_buffer[ INI_MAX_CHARS_PER_LINE+1 ];///< buffer to read file contents into - const char *m_seps; ///< for strtok parsing - const char *m_sepsPercent; ///< m_seps with percent delimiter as well - const char *m_sepsColon; ///< m_seps with colon delimiter as well - const char *m_sepsQuote; ///< token to represent a quoted ascii string - const char *m_blockEndToken; ///< token to represent end of data block Bool m_endOfFile; ///< TRUE when we've hit EOF #ifdef DEBUG_CRASHING char m_curBlockStart[ INI_MAX_CHARS_PER_LINE+1 ]; ///< first line of cur block diff --git a/Core/GameEngine/Source/Common/INI/INI.cpp b/Core/GameEngine/Source/Common/INI/INI.cpp index a59d2b0b6fc..51b285a380b 100644 --- a/Core/GameEngine/Source/Common/INI/INI.cpp +++ b/Core/GameEngine/Source/Common/INI/INI.cpp @@ -180,11 +180,6 @@ INI::INI() m_filename = "None"; m_loadType = INI_LOAD_INVALID; m_lineNum = 0; - m_seps = " \n\r\t="; ///< make sure you update m_sepsPercent/m_sepsColon as well - m_sepsPercent = " \n\r\t=%%"; - m_sepsColon = " \n\r\t=:"; - m_sepsQuote = "\"\n="; ///< stop at " = EOL - m_blockEndToken = "END"; m_endOfFile = FALSE; m_buffer[0] = 0; #ifdef DEBUG_CRASHING @@ -397,7 +392,7 @@ UnsignedInt INI::load( AsciiString filename, INILoadType loadType, Xfer *pXfer ) AsciiString currentLine = m_buffer; // the first word is the type of data we're processing - const char *token = strtok( m_buffer, m_seps ); + const char *token = strtok( m_buffer, getSeps() ); if( token ) { INIBlockParse parse = findBlockParse(token); @@ -1528,7 +1523,7 @@ void INI::initFromINIMulti( void *what, const MultiIniFieldParse& parseTableList if( field ) { - if( stricmp( field, m_blockEndToken ) == 0 ) + if( stricmp( field, getEndToken() ) == 0 ) { done = TRUE; } @@ -1590,9 +1585,8 @@ void INI::initFromINIMulti( void *what, const MultiIniFieldParse& parseTableList } //------------------------------------------------------------------------------------------------- -/*static*/ const char* INI::getNextToken(const char* seps) +/*static*/ const char* INI::getNextToken(const char* seps /*= getSeps()*/) { - if (!seps) seps = getSeps(); const char *token = ::strtok(nullptr, seps); if (!token) throw INI_INVALID_DATA; @@ -1600,9 +1594,8 @@ void INI::initFromINIMulti( void *what, const MultiIniFieldParse& parseTableList } //------------------------------------------------------------------------------------------------- -/*static*/ const char* INI::getNextTokenOrNull(const char* seps) +/*static*/ const char* INI::getNextTokenOrNull(const char* seps /*= getSeps()*/) { - if (!seps) seps = getSeps(); const char *token = ::strtok(nullptr, seps); return token; } From e762fbe13595acedf96537a47149cc89df99373d Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:59:04 +0200 Subject: [PATCH 2/7] Cleaned up a few lines. --- Core/GameEngine/Include/Common/INI.h | 8 +------- Core/GameEngine/Source/Common/INI/INI.cpp | 9 +-------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/Core/GameEngine/Include/Common/INI.h b/Core/GameEngine/Include/Common/INI.h index 1cf01644c5e..0ca1b51e51d 100644 --- a/Core/GameEngine/Include/Common/INI.h +++ b/Core/GameEngine/Include/Common/INI.h @@ -160,13 +160,8 @@ typedef void (*BuildMultiIniFieldProc)(MultiIniFieldParse& p); //------------------------------------------------------------------------------------------------- class INI { - INI(const INI&); - INI& operator=(const INI&); - public: - INI(); - ~INI(); // TheSuperHackers @feature xezon 19/08/2025 // Load a specific INI file by name and/or INI files from a directory (and its subdirectories). @@ -322,7 +317,6 @@ class INI static void parseVeterancyLevelFlags(INI* ini, void* instance, void* store, const void* userData); static void parseSoundsList( INI* ini, void *instance, void *store, const void* /*userData*/ ); - /** return the next token. if seps is not specified, the standard seps are used. @@ -401,7 +395,7 @@ class INI unsigned m_readBufferUsed; ///< number of bytes in read buffer AsciiString m_filename; ///< filename of file currently loading - INILoadType m_loadType; ///< load time for current file + INILoadType m_loadType; ///< load type for current file UnsignedInt m_lineNum; ///< current line number that's been read char m_buffer[ INI_MAX_CHARS_PER_LINE+1 ];///< buffer to read file contents into Bool m_endOfFile; ///< TRUE when we've hit EOF diff --git a/Core/GameEngine/Source/Common/INI/INI.cpp b/Core/GameEngine/Source/Common/INI/INI.cpp index 51b285a380b..fb590cb8929 100644 --- a/Core/GameEngine/Source/Common/INI/INI.cpp +++ b/Core/GameEngine/Source/Common/INI/INI.cpp @@ -180,21 +180,14 @@ INI::INI() m_filename = "None"; m_loadType = INI_LOAD_INVALID; m_lineNum = 0; - m_endOfFile = FALSE; m_buffer[0] = 0; + m_endOfFile = FALSE; #ifdef DEBUG_CRASHING m_curBlockStart[0] = 0; #endif } -//------------------------------------------------------------------------------------------------- -//------------------------------------------------------------------------------------------------- -INI::~INI() -{ - -} - //------------------------------------------------------------------------------------------------- UnsignedInt INI::loadFileDirectory( AsciiString fileDirName, INILoadType loadType, Xfer *pXfer, Bool subdirs ) { From e87afc00f8dc72f9353ec2be36ef88cc18307344 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sun, 12 Apr 2026 23:12:11 +0200 Subject: [PATCH 3/7] Replaced 'getNextTokenOrNull' + throw to 'getNextToken'. --- .../Source/GameLogic/Object/Update/AutoDepositUpdate.cpp | 5 +---- .../Source/GameLogic/Object/Update/AutoDepositUpdate.cpp | 5 +---- .../GameEngine/Source/GameLogic/Object/Update/OCLUpdate.cpp | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AutoDepositUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AutoDepositUpdate.cpp index 5d51fb3c88e..a7b088dd69e 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AutoDepositUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AutoDepositUpdate.cpp @@ -74,12 +74,9 @@ void parseUpgradePair( INI *ini, void *instance, void *store, const void *userDa info.amount = 0; const char *token = ini->getNextToken( ini->getSepsColon() ); - if ( stricmp(token, "UpgradeType") == 0 ) { - token = ini->getNextTokenOrNull( ini->getSepsColon() ); - if (!token) throw INI_INVALID_DATA; - + token = ini->getNextToken( ini->getSepsColon() ); info.type = token; } else diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AutoDepositUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AutoDepositUpdate.cpp index fc54d940340..2326b20f542 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AutoDepositUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AutoDepositUpdate.cpp @@ -75,12 +75,9 @@ void parseUpgradePair( INI *ini, void *instance, void *store, const void *userDa info.amount = 0; const char *token = ini->getNextToken( ini->getSepsColon() ); - if ( stricmp(token, "UpgradeType") == 0 ) { - token = ini->getNextTokenOrNull( ini->getSepsColon() ); - if (!token) throw INI_INVALID_DATA; - + token = ini->getNextToken( ini->getSepsColon() ); info.type = token; } else diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/OCLUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/OCLUpdate.cpp index 81020539cdd..d99c18a3eb7 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/OCLUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/OCLUpdate.cpp @@ -49,12 +49,9 @@ void parseFactionObjectCreationList( INI *ini, void *instance, void *store, cons info.m_ocl = nullptr; const char *token = ini->getNextToken( ini->getSepsColon() ); - if ( stricmp(token, "Faction") == 0 ) { - token = ini->getNextTokenOrNull( ini->getSepsColon() ); - if (!token) throw INI_INVALID_DATA; - + token = ini->getNextToken( ini->getSepsColon() ); info.m_factionName = token; } else From 4eeb8d91286cfebabe28bf3accddbb9351a6a6cc Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sun, 12 Apr 2026 23:38:47 +0200 Subject: [PATCH 4/7] Refactored while loops to for loops. --- Core/GameEngine/Source/Common/INI/INI.cpp | 8 +++----- Generals/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp | 4 +--- .../Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp | 4 +--- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Core/GameEngine/Source/Common/INI/INI.cpp b/Core/GameEngine/Source/Common/INI/INI.cpp index fb590cb8929..6cc443cfc32 100644 --- a/Core/GameEngine/Source/Common/INI/INI.cpp +++ b/Core/GameEngine/Source/Common/INI/INI.cpp @@ -1853,12 +1853,10 @@ void INI::parseSoundsList( INI* ini, void *instance, void *store, const void* /* std::vector *vec = (std::vector*) store; vec->clear(); - const char* SEPS = " \t,="; - const char *c = ini->getNextTokenOrNull(SEPS); - while ( c ) + constexpr const char* SEPS = " \t,="; + for (const char* token = ini->getNextTokenOrNull(SEPS); token; token = ini->getNextTokenOrNull(SEPS)) { - vec->push_back( c ); - c = ini->getNextTokenOrNull(SEPS); + vec->push_back(token); } } diff --git a/Generals/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp b/Generals/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp index cbae6d63d4f..651e2c4f2f0 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp @@ -202,12 +202,10 @@ TurretAIData::TurretAIData() static void parseTWS(INI* ini, void * /*instance*/, void * store, const void* /*userData*/) { UnsignedInt* tws = (UnsignedInt*)store; - const char* token = ini->getNextToken(); - while (token != nullptr) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { WeaponSlotType wslot = (WeaponSlotType)INI::scanIndexList(token, TheWeaponSlotTypeNames); *tws |= (1 << wslot); - token = ini->getNextTokenOrNull(); } } diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp index 55f4421c41e..78395baf998 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/TurretAI.cpp @@ -202,12 +202,10 @@ TurretAIData::TurretAIData() static void parseTWS(INI* ini, void * /*instance*/, void * store, const void* /*userData*/) { UnsignedInt* tws = (UnsignedInt*)store; - const char* token = ini->getNextToken(); - while (token != nullptr) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { WeaponSlotType wslot = (WeaponSlotType)INI::scanIndexList(token, TheWeaponSlotTypeNames); *tws |= (1 << wslot); - token = ini->getNextTokenOrNull(); } } From b6fb802e29c27ad91e672c30896e59d84088bce9 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sun, 12 Apr 2026 23:41:42 +0200 Subject: [PATCH 5/7] Made token naming consistent. --- .../Source/GameLogic/Object/ObjectCreationList.cpp | 8 ++++---- .../Source/GameLogic/Object/Update/AIUpdate.cpp | 8 ++++---- .../Source/GameLogic/Object/ObjectCreationList.cpp | 8 ++++---- .../Source/GameLogic/Object/Update/AIUpdate.cpp | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp index c3508284362..f1ec13163f4 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp @@ -1351,12 +1351,12 @@ class GenericObjectCreationNugget : public ObjectCreationNugget static void parseDebrisObjectNames( INI* ini, void *instance, void *store, const void* /*userData*/ ) { GenericObjectCreationNugget* debrisNugget = (GenericObjectCreationNugget*)instance; - for (const char* debrisName = ini->getNextToken(); debrisName; debrisName = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { if (TheGlobalData->m_preloadAssets) - debrisModelNamesGlobalHack.push_back(debrisName); - debrisNugget->m_names.push_back(AsciiString(debrisName)); - debrisName = ini->getNextTokenOrNull(); + debrisModelNamesGlobalHack.push_back(token); + debrisNugget->m_names.push_back(AsciiString(token)); + token = ini->getNextTokenOrNull(); } } diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate.cpp index dd3b07d378d..d900b5fc44a 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate.cpp @@ -172,16 +172,16 @@ const LocomotorTemplateVector* AIUpdateModuleData::findLocomotorTemplateVector(L } self->m_locomotorTemplates[set].clear(); - for (const char* locoName = ini->getNextToken(); locoName; locoName = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { - if (!*locoName || stricmp(locoName, "None") == 0) + if (!*token || stricmp(token, "None") == 0) continue; - NameKeyType locoKey = NAMEKEY(locoName); + NameKeyType locoKey = NAMEKEY(token); const LocomotorTemplate* lt = TheLocomotorStore->findLocomotorTemplate(locoKey); if (!lt) { - DEBUG_CRASH(("Locomotor %s not found!",locoName)); + DEBUG_CRASH(("Locomotor %s not found!",token)); throw INI_INVALID_DATA; } self->m_locomotorTemplates[set].push_back(lt); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp index d2b6940f11e..b23d6c603ae 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp @@ -1439,12 +1439,12 @@ class GenericObjectCreationNugget : public ObjectCreationNugget static void parseDebrisObjectNames( INI* ini, void *instance, void *store, const void* /*userData*/ ) { GenericObjectCreationNugget* debrisNugget = (GenericObjectCreationNugget*)instance; - for (const char* debrisName = ini->getNextToken(); debrisName; debrisName = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { if (TheGlobalData->m_preloadAssets) - debrisModelNamesGlobalHack.push_back(debrisName); - debrisNugget->m_names.push_back(AsciiString(debrisName)); - debrisName = ini->getNextTokenOrNull(); + debrisModelNamesGlobalHack.push_back(token); + debrisNugget->m_names.push_back(AsciiString(token)); + token = ini->getNextTokenOrNull(); } } diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate.cpp index 76c94b122c3..e0dd60c9ebf 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate.cpp @@ -177,16 +177,16 @@ const LocomotorTemplateVector* AIUpdateModuleData::findLocomotorTemplateVector(L } self->m_locomotorTemplates[set].clear(); - for (const char* locoName = ini->getNextToken(); locoName; locoName = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { - if (!*locoName || stricmp(locoName, "None") == 0) + if (!*token || stricmp(token, "None") == 0) continue; - NameKeyType locoKey = NAMEKEY(locoName); + NameKeyType locoKey = NAMEKEY(token); const LocomotorTemplate* lt = TheLocomotorStore->findLocomotorTemplate(locoKey); if (!lt) { - DEBUG_CRASH(("Locomotor %s not found!",locoName)); + DEBUG_CRASH(("Locomotor %s not found!",token)); throw INI_INVALID_DATA; } self->m_locomotorTemplates[set].push_back(lt); From 8bb5572b362642538593886dedd5a4ab35a7fdd8 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 13 Apr 2026 01:40:16 +0200 Subject: [PATCH 6/7] Made next token loops more consistent. --- Core/GameEngine/Source/Common/INI/INI.cpp | 8 ++++---- Generals/Code/GameEngine/Include/Common/BitFlagsIO.h | 2 +- .../Code/GameEngine/Source/Common/Thing/ThingTemplate.cpp | 2 +- .../GameLogic/Object/Behavior/InstantDeathBehavior.cpp | 6 +++--- .../GameLogic/Object/Behavior/SlowDeathBehavior.cpp | 6 +++--- .../GameLogic/Object/Update/StructureCollapseUpdate.cpp | 4 ++-- .../GameLogic/Object/Update/StructureToppleUpdate.cpp | 2 +- GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h | 2 +- .../Code/GameEngine/Source/Common/Thing/ThingTemplate.cpp | 2 +- .../GameLogic/Object/Behavior/InstantDeathBehavior.cpp | 6 +++--- .../GameLogic/Object/Behavior/SlowDeathBehavior.cpp | 6 +++--- .../GameLogic/Object/Update/StructureCollapseUpdate.cpp | 4 ++-- .../GameLogic/Object/Update/StructureToppleUpdate.cpp | 2 +- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Core/GameEngine/Source/Common/INI/INI.cpp b/Core/GameEngine/Source/Common/INI/INI.cpp index 6cc443cfc32..ba6aa85f74b 100644 --- a/Core/GameEngine/Source/Common/INI/INI.cpp +++ b/Core/GameEngine/Source/Common/INI/INI.cpp @@ -698,7 +698,7 @@ void INI::parseAsciiStringVector( INI* ini, void * /*instance*/, void *store, co { std::vector* asv = (std::vector*)store; asv->clear(); - for (const char *token = ini->getNextTokenOrNull(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char *token = ini->getNextTokenOrNull(); token; token = ini->getNextTokenOrNull()) { asv->push_back(token); } @@ -711,7 +711,7 @@ void INI::parseAsciiStringVectorAppend( INI* ini, void * /*instance*/, void *sto std::vector* asv = (std::vector*)store; // nope, don't clear. duh. // asv->clear(); - for (const char *token = ini->getNextTokenOrNull(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char *token = ini->getNextTokenOrNull(); token; token = ini->getNextTokenOrNull()) { asv->push_back(token); } @@ -723,7 +723,7 @@ void INI::parseAsciiStringVectorAppend( INI* ini, void * /*instance*/, void *sto { ScienceVec* asv = (ScienceVec*)store; asv->clear(); - for (const char *token = ini->getNextTokenOrNull(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char *token = ini->getNextTokenOrNull(); token; token = ini->getNextTokenOrNull()) { if (stricmp(token, "None") == 0) { @@ -940,7 +940,7 @@ void INI::parseBitString32( INI* ini, void * /*instance*/, void *store, const vo Bool foundAddOrSub = false; // loop through all tokens - for (const char *token = ini->getNextTokenOrNull(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char *token = ini->getNextTokenOrNull(); token; token = ini->getNextTokenOrNull()) { if (stricmp(token, "NONE") == 0) { diff --git a/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h b/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h index 16306b2d023..333529510b8 100644 --- a/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h +++ b/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h @@ -67,7 +67,7 @@ void BitFlags::parse(INI* ini, AsciiString* str) Bool foundAddOrSub = false; // loop through all tokens - for (const char *token = ini->getNextTokenOrNull(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char *token = ini->getNextTokenOrNull(); token; token = ini->getNextTokenOrNull()) { if (str) { diff --git a/Generals/Code/GameEngine/Source/Common/Thing/ThingTemplate.cpp b/Generals/Code/GameEngine/Source/Common/Thing/ThingTemplate.cpp index a3decd3c458..f306e3dbf54 100644 --- a/Generals/Code/GameEngine/Source/Common/Thing/ThingTemplate.cpp +++ b/Generals/Code/GameEngine/Source/Common/Thing/ThingTemplate.cpp @@ -548,7 +548,7 @@ static void parsePrerequisiteUnit( INI* ini, void *instance, void * /*store*/, c ProductionPrerequisite prereq; Bool orUnitWithPrevious = FALSE; - for (const char *token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char *token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { prereq.addUnitPrereq( AsciiString( token ), orUnitWithPrevious ); orUnitWithPrevious = TRUE; diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/InstantDeathBehavior.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/InstantDeathBehavior.cpp index 3321c0b025d..aa3126b588e 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/InstantDeathBehavior.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/InstantDeathBehavior.cpp @@ -62,7 +62,7 @@ InstantDeathBehaviorModuleData::InstantDeathBehaviorModuleData() static void parseFX( INI* ini, void *instance, void * /*store*/, const void* /*userData*/ ) { InstantDeathBehaviorModuleData* self = (InstantDeathBehaviorModuleData*)instance; - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const FXList *fxl = TheFXListStore->findFXList((token)); // could be null! this is OK! self->m_fx.push_back(fxl); @@ -73,7 +73,7 @@ static void parseFX( INI* ini, void *instance, void * /*store*/, const void* /*u static void parseOCL( INI* ini, void *instance, void * /*store*/, const void* /*userData*/ ) { InstantDeathBehaviorModuleData* self = (InstantDeathBehaviorModuleData*)instance; - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const ObjectCreationList *ocl = TheObjectCreationListStore->findObjectCreationList(token); // could be null! this is OK! self->m_ocls.push_back(ocl); @@ -84,7 +84,7 @@ static void parseOCL( INI* ini, void *instance, void * /*store*/, const void* /* static void parseWeapon( INI* ini, void *instance, void * /*store*/, const void* /*userData*/ ) { InstantDeathBehaviorModuleData* self = (InstantDeathBehaviorModuleData*)instance; - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const WeaponTemplate *wt = TheWeaponStore->findWeaponTemplate(token); // could be null! this is OK! self->m_weapons.push_back(wt); diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/SlowDeathBehavior.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/SlowDeathBehavior.cpp index 5f52385005c..20bdea05e43 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/SlowDeathBehavior.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/SlowDeathBehavior.cpp @@ -81,7 +81,7 @@ static void parseFX( INI* ini, void *instance, void * /*store*/, const void* /*u { SlowDeathBehaviorModuleData* self = (SlowDeathBehaviorModuleData*)instance; SlowDeathPhaseType sdphase = (SlowDeathPhaseType)INI::scanIndexList(ini->getNextToken(), TheSlowDeathPhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const FXList *fxl = TheFXListStore->findFXList((token)); // could be null! this is OK! self->m_fx[sdphase].push_back(fxl); @@ -95,7 +95,7 @@ static void parseOCL( INI* ini, void *instance, void * /*store*/, const void* /* { SlowDeathBehaviorModuleData* self = (SlowDeathBehaviorModuleData*)instance; SlowDeathPhaseType sdphase = (SlowDeathPhaseType)INI::scanIndexList(ini->getNextToken(), TheSlowDeathPhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const ObjectCreationList *ocl = TheObjectCreationListStore->findObjectCreationList(token); // could be null! this is OK! self->m_ocls[sdphase].push_back(ocl); @@ -109,7 +109,7 @@ static void parseWeapon( INI* ini, void *instance, void * /*store*/, const void* { SlowDeathBehaviorModuleData* self = (SlowDeathBehaviorModuleData*)instance; SlowDeathPhaseType sdphase = (SlowDeathPhaseType)INI::scanIndexList(ini->getNextToken(), TheSlowDeathPhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const WeaponTemplate *wt = TheWeaponStore->findWeaponTemplate(token); // could be null! this is OK! self->m_weapons[sdphase].push_back(wt); diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/StructureCollapseUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/StructureCollapseUpdate.cpp index ab594a822f3..6e09b1e201c 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/StructureCollapseUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/StructureCollapseUpdate.cpp @@ -84,7 +84,7 @@ static void parseFX( INI* ini, void *instance, void * /*store*/, const void* /*u { StructureCollapseUpdateModuleData* self = (StructureCollapseUpdateModuleData*)instance; StructureCollapsePhaseType scphase = (StructureCollapsePhaseType)INI::scanIndexList(ini->getNextToken(), TheStructureCollapsePhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const FXList *fxl = TheFXListStore->findFXList((token)); // could be null! this is OK! self->m_fxs[scphase].push_back(fxl); @@ -96,7 +96,7 @@ static void parseOCL( INI* ini, void *instance, void * /*store*/, const void* /* { StructureCollapseUpdateModuleData* self = (StructureCollapseUpdateModuleData*)instance; StructureCollapsePhaseType stphase = (StructureCollapsePhaseType)INI::scanIndexList(ini->getNextToken(), TheStructureCollapsePhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const ObjectCreationList *ocl = TheObjectCreationListStore->findObjectCreationList(token); // could be null! this is OK! self->m_ocls[stphase].push_back(ocl); diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/StructureToppleUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/StructureToppleUpdate.cpp index 4a1235e6c3c..9b847243839 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/StructureToppleUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/StructureToppleUpdate.cpp @@ -83,7 +83,7 @@ static void parseOCL( INI* ini, void *instance, void * /*store*/, const void* /* { StructureToppleUpdateModuleData* self = (StructureToppleUpdateModuleData*)instance; StructureTopplePhaseType stphase = (StructureTopplePhaseType)INI::scanIndexList(ini->getNextToken(), TheStructureTopplePhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const ObjectCreationList *ocl = TheObjectCreationListStore->findObjectCreationList(token); // could be null! this is OK! self->m_ocls[stphase].push_back(ocl); diff --git a/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h b/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h index 6e8e8959926..61afcb5d14f 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h @@ -67,7 +67,7 @@ void BitFlags::parse(INI* ini, AsciiString* str) Bool foundAddOrSub = false; // loop through all tokens - for (const char *token = ini->getNextTokenOrNull(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char *token = ini->getNextTokenOrNull(); token; token = ini->getNextTokenOrNull()) { if (str) { diff --git a/GeneralsMD/Code/GameEngine/Source/Common/Thing/ThingTemplate.cpp b/GeneralsMD/Code/GameEngine/Source/Common/Thing/ThingTemplate.cpp index 54e8b295c96..be047412608 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/Thing/ThingTemplate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/Thing/ThingTemplate.cpp @@ -630,7 +630,7 @@ static void parsePrerequisiteUnit( INI* ini, void *instance, void * /*store*/, c ProductionPrerequisite prereq; Bool orUnitWithPrevious = FALSE; - for (const char *token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char *token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { prereq.addUnitPrereq( AsciiString( token ), orUnitWithPrevious ); orUnitWithPrevious = TRUE; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/InstantDeathBehavior.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/InstantDeathBehavior.cpp index 52a2c56f61a..cc2695115a4 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/InstantDeathBehavior.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/InstantDeathBehavior.cpp @@ -62,7 +62,7 @@ InstantDeathBehaviorModuleData::InstantDeathBehaviorModuleData() static void parseFX( INI* ini, void *instance, void * /*store*/, const void* /*userData*/ ) { InstantDeathBehaviorModuleData* self = (InstantDeathBehaviorModuleData*)instance; - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const FXList *fxl = TheFXListStore->findFXList((token)); // could be null! this is OK! self->m_fx.push_back(fxl); @@ -73,7 +73,7 @@ static void parseFX( INI* ini, void *instance, void * /*store*/, const void* /*u static void parseOCL( INI* ini, void *instance, void * /*store*/, const void* /*userData*/ ) { InstantDeathBehaviorModuleData* self = (InstantDeathBehaviorModuleData*)instance; - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const ObjectCreationList *ocl = TheObjectCreationListStore->findObjectCreationList(token); // could be null! this is OK! self->m_ocls.push_back(ocl); @@ -84,7 +84,7 @@ static void parseOCL( INI* ini, void *instance, void * /*store*/, const void* /* static void parseWeapon( INI* ini, void *instance, void * /*store*/, const void* /*userData*/ ) { InstantDeathBehaviorModuleData* self = (InstantDeathBehaviorModuleData*)instance; - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const WeaponTemplate *wt = TheWeaponStore->findWeaponTemplate(token); // could be null! this is OK! self->m_weapons.push_back(wt); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/SlowDeathBehavior.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/SlowDeathBehavior.cpp index fbdd8a62a24..f2942322f9a 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/SlowDeathBehavior.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/SlowDeathBehavior.cpp @@ -81,7 +81,7 @@ static void parseFX( INI* ini, void *instance, void * /*store*/, const void* /*u { SlowDeathBehaviorModuleData* self = (SlowDeathBehaviorModuleData*)instance; SlowDeathPhaseType sdphase = (SlowDeathPhaseType)INI::scanIndexList(ini->getNextToken(), TheSlowDeathPhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const FXList *fxl = TheFXListStore->findFXList((token)); // could be null! this is OK! self->m_fx[sdphase].push_back(fxl); @@ -95,7 +95,7 @@ static void parseOCL( INI* ini, void *instance, void * /*store*/, const void* /* { SlowDeathBehaviorModuleData* self = (SlowDeathBehaviorModuleData*)instance; SlowDeathPhaseType sdphase = (SlowDeathPhaseType)INI::scanIndexList(ini->getNextToken(), TheSlowDeathPhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const ObjectCreationList *ocl = TheObjectCreationListStore->findObjectCreationList(token); // could be null! this is OK! self->m_ocls[sdphase].push_back(ocl); @@ -109,7 +109,7 @@ static void parseWeapon( INI* ini, void *instance, void * /*store*/, const void* { SlowDeathBehaviorModuleData* self = (SlowDeathBehaviorModuleData*)instance; SlowDeathPhaseType sdphase = (SlowDeathPhaseType)INI::scanIndexList(ini->getNextToken(), TheSlowDeathPhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const WeaponTemplate *wt = TheWeaponStore->findWeaponTemplate(token); // could be null! this is OK! self->m_weapons[sdphase].push_back(wt); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StructureCollapseUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StructureCollapseUpdate.cpp index 23e88ebcaf7..74d7471c902 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StructureCollapseUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StructureCollapseUpdate.cpp @@ -84,7 +84,7 @@ static void parseFX( INI* ini, void *instance, void * /*store*/, const void* /*u { StructureCollapseUpdateModuleData* self = (StructureCollapseUpdateModuleData*)instance; StructureCollapsePhaseType scphase = (StructureCollapsePhaseType)INI::scanIndexList(ini->getNextToken(), TheStructureCollapsePhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const FXList *fxl = TheFXListStore->findFXList((token)); // could be null! this is OK! self->m_fxs[scphase].push_back(fxl); @@ -96,7 +96,7 @@ static void parseOCL( INI* ini, void *instance, void * /*store*/, const void* /* { StructureCollapseUpdateModuleData* self = (StructureCollapseUpdateModuleData*)instance; StructureCollapsePhaseType stphase = (StructureCollapsePhaseType)INI::scanIndexList(ini->getNextToken(), TheStructureCollapsePhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const ObjectCreationList *ocl = TheObjectCreationListStore->findObjectCreationList(token); // could be null! this is OK! self->m_ocls[stphase].push_back(ocl); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StructureToppleUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StructureToppleUpdate.cpp index 600a6f0ccf4..0bd5891192f 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StructureToppleUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StructureToppleUpdate.cpp @@ -83,7 +83,7 @@ static void parseOCL( INI* ini, void *instance, void * /*store*/, const void* /* { StructureToppleUpdateModuleData* self = (StructureToppleUpdateModuleData*)instance; StructureTopplePhaseType stphase = (StructureTopplePhaseType)INI::scanIndexList(ini->getNextToken(), TheStructureTopplePhaseNames); - for (const char* token = ini->getNextToken(); token != nullptr; token = ini->getNextTokenOrNull()) + for (const char* token = ini->getNextToken(); token; token = ini->getNextTokenOrNull()) { const ObjectCreationList *ocl = TheObjectCreationListStore->findObjectCreationList(token); // could be null! this is OK! self->m_ocls[stphase].push_back(ocl); From 61dbf3a13ac0284048d0c0734b25983f808774a8 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 13 Apr 2026 01:44:39 +0200 Subject: [PATCH 7/7] Fixed forgotten change. --- Core/GameEngine/Source/Common/INI/INI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/GameEngine/Source/Common/INI/INI.cpp b/Core/GameEngine/Source/Common/INI/INI.cpp index ba6aa85f74b..2181538c363 100644 --- a/Core/GameEngine/Source/Common/INI/INI.cpp +++ b/Core/GameEngine/Source/Common/INI/INI.cpp @@ -1568,7 +1568,7 @@ void INI::initFromINIMulti( void *what, const MultiIniFieldParse& parseTableList done = TRUE; DEBUG_CRASH( ("Error parsing block '%s', in INI file '%s'. Missing '%s' token", - m_curBlockStart, getFilename().str(), m_blockEndToken) ); + m_curBlockStart, getFilename().str(), getEndToken()) ); throw INI_MISSING_END_TOKEN; }