From 62f06a9af34b70f1c3bfbdfb75b6405cdac8d4c5 Mon Sep 17 00:00:00 2001 From: Garux Date: Sun, 30 Oct 2022 12:43:25 +0300 Subject: [PATCH] appease incompatible fgds loading: only show message window once, the rest of messages go to the log report problem fgd line parse block names case insensitively #115 --- radiant/eclass_fgd.cpp | 43 ++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/radiant/eclass_fgd.cpp b/radiant/eclass_fgd.cpp index 8b440391..a0e3e197 100644 --- a/radiant/eclass_fgd.cpp +++ b/radiant/eclass_fgd.cpp @@ -88,11 +88,30 @@ void EntityClassFGD_forEach( EntityClassVisitor& visitor ){ } } +#define PARSE_ERROR "error parsing fgd entity class definition at line " << tokeniser.getLine() << ':' << tokeniser.getColumn() + +static bool s_fgd_warned = false; + inline bool EntityClassFGD_parseToken( Tokeniser& tokeniser, const char* token ){ - return string_equal( tokeniser.getToken(), token ); + const bool w = s_fgd_warned; + const bool ok = string_equal( tokeniser.getToken(), token ); + if( !ok ){ + globalErrorStream() << PARSE_ERROR << "\nExpected " << makeQuoted( token ) << '\n'; + s_fgd_warned = true; + } + return w || ok; } -#define PARSE_ERROR "error parsing entity class definition" +#define ERROR_FGD( message )\ +do{\ + if( s_fgd_warned )\ + globalErrorStream() << message << '\n';\ + else{\ + ERROR_MESSAGE( message );\ + s_fgd_warned = true;\ + }\ +}while( 0 ) + void EntityClassFGD_parseSplitString( Tokeniser& tokeniser, CopiedString& string ){ StringOutputStream buffer( 256 ); @@ -253,7 +272,7 @@ void EntityClassFGD_parseClass( Tokeniser& tokeniser, bool fixedsize, bool isBas } else { - ERROR_MESSAGE( PARSE_ERROR ); + ERROR_FGD( PARSE_ERROR ); } } @@ -504,7 +523,7 @@ void EntityClassFGD_parseClass( Tokeniser& tokeniser, bool fixedsize, bool isBas } else { - ERROR_MESSAGE( "unknown key type: " << makeQuoted( type ) ); + ERROR_FGD( "unknown key type: " << makeQuoted( type ) ); } tokeniser.nextLine(); } @@ -531,18 +550,18 @@ void EntityClassFGD_parse( TextInputStream& inputStream, const char* path ){ if ( blockType == 0 ) { break; } - if ( string_equal( blockType, "@SolidClass" ) ) { + if ( string_equal_nocase( blockType, "@SolidClass" ) ) { EntityClassFGD_parseClass( tokeniser, false, false ); } - else if ( string_equal( blockType, "@BaseClass" ) ) { + else if ( string_equal_nocase( blockType, "@BaseClass" ) ) { EntityClassFGD_parseClass( tokeniser, false, true ); } - else if ( string_equal( blockType, "@PointClass" ) + else if ( string_equal_nocase( blockType, "@PointClass" ) // hl2 below - || string_equal( blockType, "@KeyFrameClass" ) - || string_equal( blockType, "@MoveClass" ) - || string_equal( blockType, "@FilterClass" ) - || string_equal( blockType, "@NPCClass" ) ) { + || string_equal_nocase( blockType, "@KeyFrameClass" ) + || string_equal_nocase( blockType, "@MoveClass" ) + || string_equal_nocase( blockType, "@FilterClass" ) + || string_equal_nocase( blockType, "@NPCClass" ) ) { EntityClassFGD_parseClass( tokeniser, true, false ); } // hl2 below @@ -560,7 +579,7 @@ void EntityClassFGD_parse( TextInputStream& inputStream, const char* path ){ } else { - ERROR_MESSAGE( "unknown block type: " << makeQuoted( blockType ) ); + ERROR_FGD( "unknown block type: " << makeQuoted( blockType ) ); } }