@@ -180,26 +180,14 @@ INI::INI()
180180 m_filename = " None" ;
181181 m_loadType = INI_LOAD_INVALID;
182182 m_lineNum = 0 ;
183- m_seps = " \n\r\t =" ; // /< make sure you update m_sepsPercent/m_sepsColon as well
184- m_sepsPercent = " \n\r\t =%%" ;
185- m_sepsColon = " \n\r\t =:" ;
186- m_sepsQuote = " \"\n =" ; // /< stop at " = EOL
187- m_blockEndToken = " END" ;
188- m_endOfFile = FALSE ;
189183 m_buffer[0 ] = 0 ;
184+ m_endOfFile = FALSE ;
190185#ifdef DEBUG_CRASHING
191186 m_curBlockStart[0 ] = 0 ;
192187#endif
193188
194189}
195190
196- // -------------------------------------------------------------------------------------------------
197- // -------------------------------------------------------------------------------------------------
198- INI::~INI ()
199- {
200-
201- }
202-
203191// -------------------------------------------------------------------------------------------------
204192UnsignedInt INI::loadFileDirectory ( AsciiString fileDirName, INILoadType loadType, Xfer *pXfer, Bool subdirs )
205193{
@@ -397,7 +385,7 @@ UnsignedInt INI::load( AsciiString filename, INILoadType loadType, Xfer *pXfer )
397385 AsciiString currentLine = m_buffer;
398386
399387 // the first word is the type of data we're processing
400- const char *token = strtok ( m_buffer, m_seps );
388+ const char *token = strtok ( m_buffer, getSeps () );
401389 if ( token )
402390 {
403391 INIBlockParse parse = findBlockParse (token);
@@ -710,7 +698,7 @@ void INI::parseAsciiStringVector( INI* ini, void * /*instance*/, void *store, co
710698{
711699 std::vector<AsciiString>* asv = (std::vector<AsciiString>*)store;
712700 asv->clear ();
713- for (const char *token = ini->getNextTokenOrNull (); token != nullptr ; token = ini->getNextTokenOrNull ())
701+ for (const char *token = ini->getNextTokenOrNull (); token; token = ini->getNextTokenOrNull ())
714702 {
715703 asv->push_back (token);
716704 }
@@ -723,7 +711,7 @@ void INI::parseAsciiStringVectorAppend( INI* ini, void * /*instance*/, void *sto
723711 std::vector<AsciiString>* asv = (std::vector<AsciiString>*)store;
724712 // nope, don't clear. duh.
725713 // asv->clear();
726- for (const char *token = ini->getNextTokenOrNull (); token != nullptr ; token = ini->getNextTokenOrNull ())
714+ for (const char *token = ini->getNextTokenOrNull (); token; token = ini->getNextTokenOrNull ())
727715 {
728716 asv->push_back (token);
729717 }
@@ -735,7 +723,7 @@ void INI::parseAsciiStringVectorAppend( INI* ini, void * /*instance*/, void *sto
735723{
736724 ScienceVec* asv = (ScienceVec*)store;
737725 asv->clear ();
738- for (const char *token = ini->getNextTokenOrNull (); token != nullptr ; token = ini->getNextTokenOrNull ())
726+ for (const char *token = ini->getNextTokenOrNull (); token; token = ini->getNextTokenOrNull ())
739727 {
740728 if (stricmp (token, " None" ) == 0 )
741729 {
@@ -952,7 +940,7 @@ void INI::parseBitString32( INI* ini, void * /*instance*/, void *store, const vo
952940 Bool foundAddOrSub = false ;
953941
954942 // loop through all tokens
955- for (const char *token = ini->getNextTokenOrNull (); token != nullptr ; token = ini->getNextTokenOrNull ())
943+ for (const char *token = ini->getNextTokenOrNull (); token; token = ini->getNextTokenOrNull ())
956944 {
957945 if (stricmp (token, " NONE" ) == 0 )
958946 {
@@ -1528,7 +1516,7 @@ void INI::initFromINIMulti( void *what, const MultiIniFieldParse& parseTableList
15281516 if ( field )
15291517 {
15301518
1531- if ( stricmp ( field, m_blockEndToken ) == 0 )
1519+ if ( stricmp ( field, getEndToken () ) == 0 )
15321520 {
15331521 done = TRUE ;
15341522 }
@@ -1580,7 +1568,7 @@ void INI::initFromINIMulti( void *what, const MultiIniFieldParse& parseTableList
15801568
15811569 done = TRUE ;
15821570 DEBUG_CRASH ( (" Error parsing block '%s', in INI file '%s'. Missing '%s' token" ,
1583- m_curBlockStart, getFilename ().str (), m_blockEndToken ) );
1571+ m_curBlockStart, getFilename ().str (), getEndToken () ) );
15841572 throw INI_MISSING_END_TOKEN;
15851573
15861574 }
@@ -1592,7 +1580,6 @@ void INI::initFromINIMulti( void *what, const MultiIniFieldParse& parseTableList
15921580// -------------------------------------------------------------------------------------------------
15931581/* static*/ const char * INI::getNextToken (const char * seps)
15941582{
1595- if (!seps) seps = getSeps ();
15961583 const char *token = ::strtok (nullptr , seps);
15971584 if (!token)
15981585 throw INI_INVALID_DATA;
@@ -1602,7 +1589,6 @@ void INI::initFromINIMulti( void *what, const MultiIniFieldParse& parseTableList
16021589// -------------------------------------------------------------------------------------------------
16031590/* static*/ const char * INI::getNextTokenOrNull (const char * seps)
16041591{
1605- if (!seps) seps = getSeps ();
16061592 const char *token = ::strtok (nullptr , seps);
16071593 return token;
16081594}
@@ -1618,8 +1604,17 @@ void INI::initFromINIMulti( void *what, const MultiIniFieldParse& parseTableList
16181604template <typename Type>
16191605Type scanType (std::string_view token)
16201606{
1621- // TheSuperHackers @info std::from_chars cannot parse "-1" as uint32 so the result needs to be int64 for integers.
1622- std::conditional_t <std::is_integral_v<Type>, Int64, Real> result{};
1607+ DEBUG_ASSERTCRASH (!token.empty (), (" token is not expected to be empty" ));
1608+
1609+ // Unlike sscanf, std::from_chars cannot parse "+".
1610+ // Consume the plus symbol to accommodate custom ini files that have numbers prefixed with a plus.
1611+ if (token[0 ] == ' +' )
1612+ {
1613+ token.remove_prefix (1 );
1614+ }
1615+
1616+ // Unlike sscanf, std::from_chars cannot parse "-" as unsigned integer.
1617+ std::conditional_t <std::is_integral_v<Type>, Int64, Type> result{};
16231618 const auto [ptr, ec] = std::from_chars (token.data (), token.data () + token.size (), result);
16241619
16251620 if (ec != std::errc{})
@@ -1867,12 +1862,10 @@ void INI::parseSoundsList( INI* ini, void *instance, void *store, const void* /*
18671862 std::vector<AsciiString> *vec = (std::vector<AsciiString>*) store;
18681863 vec->clear ();
18691864
1870- const char * SEPS = " \t ,=" ;
1871- const char *c = ini->getNextTokenOrNull (SEPS);
1872- while ( c )
1865+ constexpr const char * Seps = " \t ,=" ;
1866+ for (const char * token = ini->getNextTokenOrNull (Seps); token; token = ini->getNextTokenOrNull (Seps))
18731867 {
1874- vec->push_back ( c );
1875- c = ini->getNextTokenOrNull (SEPS);
1868+ vec->push_back (token);
18761869 }
18771870}
18781871
0 commit comments