@@ -176,10 +176,8 @@ Parser::~Parser()
176176/* Parse the file. */
177177void Parser::Run ()
178178{
179- int error_line = -1 ;
180- int error_col = -1 ;
181- UCS2String error_filename (POV_FILENAME_BUFFER_CHARS, 0 ); // Pre-claim some memory, so we can handle an out-of-memory error.
182- POV_OFF_T error_pos = -1 ;
179+ SourceInfo errorInfo (UCS2String (POV_FILENAME_BUFFER_CHARS, 0 ), // Pre-claim some memory, so we can handle an out-of-memory error.
180+ SourcePosition (-1 ,-1 ,-1 ));
183181
184182 // Outer try/catch block to handle out-of-memory conditions
185183 // occurring during regular error handling.
@@ -301,10 +299,8 @@ void Parser::Run()
301299 {
302300 // take a (local) copy of error location prior to freeing token data
303301 // NB error_filename has been pre-allocated for strings up to POV_FILENAME_BUFFER_CHARS
304- error_filename = CurrentFileName ();
305- error_line = CurrentFilePosition ().line ;
306- error_col = CurrentFilePosition ().column ;
307- error_pos = CurrentFilePosition ().offset ;
302+ errorInfo.fileName = CurrentFileName ();
303+ errorInfo.position = CurrentFilePosition ();
308304 }
309305
310306 // free up some memory before proceeding with error notification.
@@ -313,8 +309,8 @@ void Parser::Run()
313309 Default_Texture = nullptr ;
314310 Destroy_Random_Generators ();
315311
316- if (error_line != -1 )
317- mMessageFactory .ErrorAt (POV_EXCEPTION_CODE (kOutOfMemoryErr ), error_filename, error_line, error_col, error_pos , " Out of memory." );
312+ if (errorInfo. position . line != -1 )
313+ mMessageFactory .ErrorAt (POV_EXCEPTION_CODE (kOutOfMemoryErr ), errorInfo , " Out of memory." );
318314 else
319315 Error (" Out of memory." );
320316 }
@@ -769,7 +765,15 @@ void Parser::Parse_End(TokenId openTokenId, TokenId expectTokenId)
769765 {
770766 POV_PARSER_ASSERT (!maBraceStack.empty ());
771767 POV_PARSER_ASSERT (openTokenId == maBraceStack.back ().openToken );
768+
769+ if (!maIncludeStack.empty () && (maBraceStack.size () <= maIncludeStack.back ().braceStackSize ))
770+ {
771+ BraceStackEntry& braceStackEntry = maBraceStack.back ();
772+ // Include file has closed more braces/parentheses/etc. than it has opened.
773+ Warning (" Unbalanced %s in include file" , Get_Token_String (CurrentTokenId ()));
774+ }
772775 maBraceStack.pop_back ();
776+
773777 return ;
774778 }
775779
@@ -6518,7 +6522,7 @@ ObjectPtr Parser::Parse_TrueType ()
65186522 if (sceneData->EffectiveLanguageVersion () < 380 )
65196523 {
65206524 if (sceneData->legacyCharset == LegacyCharset::kUnspecified )
6521- sceneData-> legacyCharset = LegacyCharset::kASCII ;
6525+ legacyCharset = LegacyCharset::kASCII ;
65226526 else
65236527 legacyCharset = sceneData->legacyCharset ;
65246528
@@ -10611,6 +10615,18 @@ void Parser::Warning(const char *format,...)
1061110615 Warning (kWarningGeneral , localvsbuffer);
1061210616}
1061310617
10618+ void Parser::Warning (const MessageContext& loc, const char *format, ...)
10619+ {
10620+ va_list marker;
10621+ char localvsbuffer[1024 ];
10622+
10623+ va_start (marker, format);
10624+ std::vsnprintf (localvsbuffer, sizeof (localvsbuffer), format, marker);
10625+ va_end (marker);
10626+
10627+ Warning (kWarningGeneral , loc, localvsbuffer);
10628+ }
10629+
1061410630void Parser::Warning (WarningLevel level, const char *format,...)
1061510631{
1061610632 POV_PARSER_ASSERT (level >= kWarningGeneral );
@@ -10628,6 +10644,20 @@ void Parser::Warning(WarningLevel level, const char *format,...)
1062810644 mMessageFactory .Warning (level, " %s" , localvsbuffer);
1062910645}
1063010646
10647+ void Parser::Warning (WarningLevel level, const MessageContext& loc, const char *format, ...)
10648+ {
10649+ POV_PARSER_ASSERT (level >= kWarningGeneral );
10650+
10651+ va_list marker;
10652+ char localvsbuffer[1024 ];
10653+
10654+ va_start (marker, format);
10655+ std::vsnprintf (localvsbuffer, sizeof (localvsbuffer), format, marker);
10656+ va_end (marker);
10657+
10658+ mMessageFactory .WarningAt (level, loc, " %s" , localvsbuffer);
10659+ }
10660+
1063110661void Parser::VersionWarning (unsigned int sinceVersion, const char *format,...)
1063210662{
1063310663 if (sceneData->EffectiveLanguageVersion () >= sinceVersion)
0 commit comments