diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 55e260e0..aefe2fa7 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -9099,7 +9099,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) */ while( fizparser.ok() ) { - inputline = fizparser.getToken( false, "\n" ); + inputline = fizparser.getToken( false, "\n\r" ); bool comment = ( ( inputline.find('#') != std::string::npos ) || ( inputline.compare( 0, 2, "//" ) == 0 ) ); diff --git a/drivermouseinput.cpp b/drivermouseinput.cpp index 80be91d4..2e56342b 100644 --- a/drivermouseinput.cpp +++ b/drivermouseinput.cpp @@ -194,7 +194,7 @@ drivermouse_input::recall_bindings() { } // NOTE: to simplify things we expect one entry per line, and whole entry in one line - while( true == bindingparser.getTokens( 1, true, "\n" ) ) { + while( true == bindingparser.getTokens( 1, true, "\n\r" ) ) { std::string bindingentry; bindingparser >> bindingentry; diff --git a/gamepadinput.cpp b/gamepadinput.cpp index 0ee7e6cf..012bb33e 100644 --- a/gamepadinput.cpp +++ b/gamepadinput.cpp @@ -174,7 +174,7 @@ gamepad_input::recall_bindings() { { "value_invert", input_type::value_invert } }; // NOTE: to simplify things we expect one entry per line, and whole entry in one line - while( true == bindingparser.getTokens( 1, true, "\n" ) ) { + while( true == bindingparser.getTokens( 1, true, "\n\r" ) ) { std::string bindingentry; bindingparser >> bindingentry; diff --git a/keyboardinput.cpp b/keyboardinput.cpp index 4d390d39..dae06ebf 100644 --- a/keyboardinput.cpp +++ b/keyboardinput.cpp @@ -63,7 +63,7 @@ keyboard_input::recall_bindings() { }; // NOTE: to simplify things we expect one entry per line, and whole entry in one line - while( true == bindingparser.getTokens( 1, true, "\n" ) ) { + while( true == bindingparser.getTokens( 1, true, "\n\r" ) ) { std::string bindingentry; bindingparser >> bindingentry; diff --git a/parser.cpp b/parser.cpp index bc7ec1f5..7fc7d7c0 100644 --- a/parser.cpp +++ b/parser.cpp @@ -230,23 +230,14 @@ std::string cParser::readToken( bool ToLower, const char *Break ) { token.insert( pos, "none" ); // zabezpieczenie przed brakiem parametru } } - + // launch child parser if include directive found. + // NOTE: parameter collecting uses default set of token separators. if( token == "include" ) { - // launch child parser if include directive found. - // NOTE: parameter collecting uses default set of token separators. std::string includefile = readToken(ToLower); // nazwa pliku if( ( true == LoadTraction ) || ( ( includefile.find( "tr/" ) == std::string::npos ) && ( includefile.find( "tra/" ) == std::string::npos ) ) ) { - // get parameter list for the child parser - std::vector includeparameters; - std::string parameter = readToken( false ); // w parametrach nie zmniejszamy - while( ( parameter.empty() == false ) - && ( parameter != "end" ) ) { - includeparameters.emplace_back( parameter ); - parameter = readToken( false ); - } - mIncludeParser = std::make_shared( includefile, buffer_FILE, mPath, LoadTraction, includeparameters ); + mIncludeParser = std::make_shared( includefile, buffer_FILE, mPath, LoadTraction, readParameters( *this ) ); mIncludeParser->autoclear( m_autoclear ); if( mIncludeParser->mSize <= 0 ) { ErrorLog( "Bad include: can't open file \"" + includefile + "\"" ); @@ -259,10 +250,37 @@ std::string cParser::readToken( bool ToLower, const char *Break ) { } token = readToken(ToLower, 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 ) ); + std::string includefile = includeparser.readToken( ToLower ); // nazwa pliku + if( ( true == LoadTraction ) + || ( ( includefile.find( "tr/" ) == std::string::npos ) + && ( includefile.find( "tra/" ) == std::string::npos ) ) ) { + mIncludeParser = std::make_shared( includefile, buffer_FILE, mPath, LoadTraction, readParameters( includeparser ) ); + mIncludeParser->autoclear( m_autoclear ); + if( mIncludeParser->mSize <= 0 ) { + ErrorLog( "Bad include: can't open file \"" + includefile + "\"" ); + } + } + token = readToken( ToLower, Break ); + } // all done return token; } +std::vector cParser::readParameters( cParser &Input ) { + + std::vector includeparameters; + std::string parameter = Input.readToken( false ); // w parametrach nie zmniejszamy + while( ( parameter.empty() == false ) + && ( parameter != "end" ) ) { + includeparameters.emplace_back( parameter ); + parameter = Input.readToken( false ); + } + return includeparameters; +} + std::string cParser::readQuotes(char const Quote) { // read the stream until specified char or stream end std::string token = ""; char c { 0 }; diff --git a/parser.h b/parser.h index fb44f55d..2fb82f48 100644 --- a/parser.h +++ b/parser.h @@ -89,6 +89,7 @@ class cParser //: public std::stringstream private: // methods: std::string readToken(bool ToLower = true, const char *Break = "\n\r\t ;"); + std::vector readParameters( cParser &Input ); std::string readQuotes( char const Quote = '\"' ); void skipComment( std::string const &Endmark ); bool findQuotes( std::string &String ); diff --git a/uart.cpp b/uart.cpp index e9bcbbf2..4be69c0a 100644 --- a/uart.cpp +++ b/uart.cpp @@ -105,7 +105,7 @@ uart_input::recall_bindings() { { "value", input_type_t::value } }; // NOTE: to simplify things we expect one entry per line, and whole entry in one line - while( true == bindingparser.getTokens( 1, true, "\n" ) ) { + while( true == bindingparser.getTokens( 1, true, "\n\r" ) ) { std::string bindingentry; bindingparser >> bindingentry; diff --git a/version.h b/version.h index 296322d2..d995e1a0 100644 --- a/version.h +++ b/version.h @@ -1,5 +1,5 @@ #pragma once #define VERSION_MAJOR 20 -#define VERSION_MINOR 615 +#define VERSION_MINOR 630 #define VERSION_REVISION 0