]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/parser.cpp
Restructure control statement processing
[libs/datafile.git] / source / parser.cpp
index 3957cf343642b54f2f5b6123be3e907bc200436e..6166e561a984a0d99878f313199003fac095039b 100644 (file)
@@ -32,37 +32,17 @@ Statement Parser::parse(bool raw)
        {
                while(1)
                {
-                       Statement st = mode->parse(raw);
-                       if(st.keyword=="__bin")
+                       Statement st = mode->parse();
+                       if(!st.keyword.compare(0, 2, "__"))
                        {
-                               delete mode;
-                               mode = new BinaryParser(in, src);
+                               st.control = true;
+                               process_control_statement(st);
                        }
-                       else if(st.keyword=="__text")
-                       {
-                               delete mode;
-                               mode = new TextParser(in, src);
-                       }
-                       else if(st.keyword=="__z")
-                               in.set_decompress();
-                       else if(st.keyword=="__src")
-                       {
-                               string s = st.args[0].get<string>();
-                               if(s.empty())
-                                       src = main_src;
-                               else
-                                       src = format("%s[%s]", main_src, s);
-                       }
-                       else if(st.keyword=="__end")
-                       {
-                               good = false;
-                               return raw ? st : Statement();
-                       }
-                       else
-                               return st;
 
-                       if(raw)
+                       if(raw || !st.control)
                                return st;
+                       else if(!good)  // This will occur with an __end statement
+                               return Statement();
                }
        }
        catch(const exception &e)
@@ -75,5 +55,33 @@ Statement Parser::parse(bool raw)
        }
 }
 
+void Parser::process_control_statement(const Statement &st)
+{
+       if(st.keyword=="__bin")
+       {
+               delete mode;
+               mode = new BinaryParser(in, src);
+       }
+       else if(st.keyword=="__text")
+       {
+               delete mode;
+               mode = new TextParser(in, src);
+       }
+       else if(st.keyword=="__z")
+               in.set_decompress();
+       else if(st.keyword=="__src")
+       {
+               string s = st.args[0].get<string>();
+               if(s.empty())
+                       src = main_src;
+               else
+                       src = format("%s[%s]", main_src, s);
+       }
+       else if(st.keyword=="__end")
+               good = false;
+       else
+               mode->process_control_statement(st);
+}
+
 } // namespace DataFile
 } // namespace Msp