X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Fparser.cpp;h=6166e561a984a0d99878f313199003fac095039b;hp=3957cf343642b54f2f5b6123be3e907bc200436e;hb=29fafaa2c570b0cf92f41eeb534cfb65a841a892;hpb=0d8df25704366f3576c417436c90fbac2e479632 diff --git a/source/parser.cpp b/source/parser.cpp index 3957cf3..6166e56 100644 --- a/source/parser.cpp +++ b/source/parser.cpp @@ -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(); - 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(); + 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