diff --git a/DynObj.cpp b/DynObj.cpp index 9ebf2bfa..e4f4b6b4 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -4969,8 +4969,7 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co + " " + ReplacableSkin // (p3) + " end", cParser::buffer_TEXT, - asBaseDir ); - parser.allowRandomIncludes = true; + asBaseDir, true, std::vector(), true ); std::string token; do { token = ""; diff --git a/Train.cpp b/Train.cpp index 5e1b28f8..b0246fc2 100644 --- a/Train.cpp +++ b/Train.cpp @@ -8573,7 +8573,7 @@ bool TTrain::LoadMMediaFile(std::string const &asFileName) m_radiosound.owner( DynamicObject ); CabSoundLocations.clear(); - cParser parser( asFileName, cParser::buffer_FILE, DynamicObject->asBaseDir ); + cParser parser( asFileName, cParser::buffer_FILE, DynamicObject->asBaseDir, true, std::vector(), true ); // NOTE: yaml-style comments are disabled until conflict in use of # is resolved // parser.addCommentStyle( "#", "\n" ); std::string token; @@ -8700,8 +8700,7 @@ bool TTrain::InitializeCab(int NewCabNo, std::string const &asFileName) std::string cabstr("cab" + std::to_string(cabindex) + "definition:"); - cParser parser( asFileName, cParser::buffer_FILE, DynamicObject->asBaseDir ); - parser.allowRandomIncludes = true; + cParser parser( asFileName, cParser::buffer_FILE, DynamicObject->asBaseDir, true, std::vector(), true ); // NOTE: yaml-style comments are disabled until conflict in use of # is resolved // parser.addCommentStyle( "#", "\n" ); std::string token; diff --git a/parser.cpp b/parser.cpp index 91b12c7d..aa64b1c8 100644 --- a/parser.cpp +++ b/parser.cpp @@ -24,9 +24,10 @@ http://mozilla.org/MPL/2.0/. // cParser -- generic class for parsing text data. // constructors -cParser::cParser( std::string const &Stream, buffertype const Type, std::string Path, bool const Loadtraction, std::vector Parameters ) : +cParser::cParser( std::string const &Stream, buffertype const Type, std::string Path, bool const Loadtraction, std::vector Parameters, bool allowRandom ) : mPath(Path), - LoadTraction( Loadtraction ) { + LoadTraction( Loadtraction ), + allowRandomIncludes(allowRandom) { // store to calculate sub-sequent includes from relative path if( Type == buffertype::buffer_FILE ) { mFile = Stream; @@ -252,8 +253,7 @@ std::string cParser::readToken( bool ToLower, const char *Break ) { && ( false == contains( includefile, "tra/" ) ) ) ) { if (Global.ParserLogIncludes) WriteLog("including: " + includefile); - mIncludeParser = std::make_shared( includefile, buffer_FILE, mPath, LoadTraction, readParameters( *this ) ); - mIncludeParser->allowRandomIncludes = allowRandomIncludes; + mIncludeParser = std::make_shared( includefile, buffer_FILE, mPath, LoadTraction, readParameters( *this ), allowRandomIncludes ); mIncludeParser->autoclear( m_autoclear ); if( mIncludeParser->mSize <= 0 ) { ErrorLog( "Bad include: can't open file \"" + includefile + "\"" ); @@ -269,7 +269,6 @@ std::string cParser::readToken( bool ToLower, const char *Break ) { else if( ( std::strcmp( Break, "\n\r" ) == 0 ) && ( token.compare( 0, 7, "include" ) == 0 ) ) { // HACK: if the parser reads full lines we expect this line to contain entire include directive, to make parsing easier cParser includeparser( token.substr( 7 ) ); - includeparser.allowRandomIncludes = allowRandomIncludes; std::string includefile = allowRandomIncludes ? deserialize_random_set( includeparser ) : includeparser.readToken( ToLower ); // nazwa pliku replace_slashes(includefile); if( ( true == LoadTraction ) @@ -277,8 +276,7 @@ std::string cParser::readToken( bool ToLower, const char *Break ) { && ( false == contains( includefile, "tra/" ) ) ) ) { if (Global.ParserLogIncludes) WriteLog("including: " + includefile); - mIncludeParser = std::make_shared( includefile, buffer_FILE, mPath, LoadTraction, readParameters( includeparser ) ); - mIncludeParser->allowRandomIncludes = allowRandomIncludes; + mIncludeParser = std::make_shared( includefile, buffer_FILE, mPath, LoadTraction, readParameters( includeparser ), allowRandomIncludes ); mIncludeParser->autoclear( m_autoclear ); if( mIncludeParser->mSize <= 0 ) { ErrorLog( "Bad include: can't open file \"" + includefile + "\"" ); @@ -384,8 +382,7 @@ void cParser::injectString(const std::string &str) mIncludeParser->injectString(str); } else { - mIncludeParser = std::make_shared( str, buffer_TEXT, "", LoadTraction ); - mIncludeParser->allowRandomIncludes = allowRandomIncludes; + mIncludeParser = std::make_shared( str, buffer_TEXT, "", LoadTraction, std::vector(), allowRandomIncludes ); mIncludeParser->autoclear( m_autoclear ); } } diff --git a/parser.h b/parser.h index c96e4a29..57dae579 100644 --- a/parser.h +++ b/parser.h @@ -28,7 +28,7 @@ class cParser //: public std::stringstream buffer_TEXT }; // constructors: - cParser(std::string const &Stream, buffertype const Type = buffer_TEXT, std::string Path = "", bool const Loadtraction = true, std::vector Parameters = std::vector() ); + cParser(std::string const &Stream, buffertype const Type = buffer_TEXT, std::string Path = "", bool const Loadtraction = true, std::vector Parameters = std::vector(), bool allowRandom = false ); // destructor: virtual ~cParser(); // methods: @@ -91,7 +91,6 @@ class cParser //: public std::stringstream // returns number of currently processed line in main file, -1 if inside include int LineMain() const; bool expandIncludes = true; - bool allowRandomIncludes = false; private: // methods: @@ -119,6 +118,7 @@ class cParser //: public std::stringstream std::shared_ptr mIncludeParser; // child class to handle include directives. std::vector parameters; // parameter list for included file. std::deque tokens; + bool allowRandomIncludes = false; };