@@ -305,10 +305,31 @@ class Parser : public SceneTask
305305
306306 struct DATA_FILE
307307 {
308- shared_ptr<pov_base::ITextStream> In_File;
308+ shared_ptr<RawTokenizer> inTokenizer;
309+ RawToken inToken;
309310 shared_ptr<pov_base::OTextStream> Out_File;
311+ bool inUngetToken : 1 ;
310312 bool busyParsing : 1 ; // /< `true` if parsing a statement related to the file, `false` otherwise.
311- bool R_Flag : 1 ;
313+
314+ bool ReadNextToken ()
315+ {
316+ POV_PARSER_ASSERT (inTokenizer != nullptr );
317+ if (!inUngetToken && !inTokenizer->GetNextToken (inToken))
318+ {
319+ inToken.id = END_OF_FILE_TOKEN;
320+ return false ;
321+ }
322+ inUngetToken = false ;
323+ return true ;
324+ }
325+ void UnReadToken ()
326+ {
327+ POV_PARSER_ASSERT (!inUngetToken);
328+ if (inToken.id != END_OF_FILE_TOKEN)
329+ inUngetToken = true ;
330+ }
331+
332+ DATA_FILE () : inUngetToken(false ), busyParsing(false ) {}
312333 };
313334
314335 // constructor
@@ -409,7 +430,7 @@ class Parser : public SceneTask
409430 void Release_Entry_Reference (SYM_TABLE *table, SYM_ENTRY *Entry);
410431 SYM_ENTRY *Destroy_Entry (SYM_ENTRY *Entry, bool destroyName);
411432 bool Parse_Ifdef_Param ();
412- int Parse_For_Param (char ** , DBL*, DBL*);
433+ int Parse_For_Param (UTF8String& , DBL*, DBL*);
413434
414435 // parstxtr.h/parstxtr.cpp
415436 TEXTURE *Parse_Texture (void );
@@ -471,7 +492,6 @@ class Parser : public SceneTask
471492 void Parse_Float_Param2 (DBL *Val1, DBL *Val2);
472493 void Init_Random_Generators (void );
473494 void Destroy_Random_Generators (void );
474- DBL Parse_Signed_Float (void );
475495
476496 // function.h/function.cpp
477497 FUNCTION_PTR Parse_Function (void );
@@ -586,8 +606,6 @@ class Parser : public SceneTask
586606
587607 int line_count;
588608
589- bool readingExternalFile;
590-
591609 vector<RawTokenizer::HotBookmark> maIncludeStack;
592610
593611 struct CS_ENTRY
@@ -598,11 +616,11 @@ class Parser : public SceneTask
598616 bool Macro_Same_Flag;
599617 bool Switch_Case_Ok_Flag;
600618 Macro *PMac;
601- char * Loop_Identifier;
619+ UTF8String Loop_Identifier;
602620 DBL For_Loop_End;
603621 DBL For_Loop_Step;
604- CS_ENTRY () : Cond_Type(BUSY_COND), PMac(nullptr ), Loop_Identifier( nullptr ) {}
605- ~CS_ENTRY () { POV_PARSER_ASSERT (Loop_Identifier == nullptr ); }
622+ CS_ENTRY () : Cond_Type(BUSY_COND), PMac(nullptr ) {}
623+ ~CS_ENTRY () {}
606624 };
607625
608626 vector<CS_ENTRY> Cond_Stack;
@@ -738,6 +756,7 @@ class Parser : public SceneTask
738756 void Parse_Read (void );
739757 void Parse_Write (void );
740758 int Parse_Read_Value (DATA_FILE *User_File, TokenId Previous, TokenId *NumberPtr, void **DataPtr);
759+ bool Parse_Read_Float_Value (DBL& val, DATA_FILE *User_File);
741760 void Check_Macro_Vers (void );
742761 DBL Parse_Cond_Param (void );
743762 void Parse_Cond_Param2 (DBL *V1,DBL *V2);
0 commit comments