X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fparser.cpp;h=6166e561a984a0d99878f313199003fac095039b;hb=29fafaa2c570b0cf92f41eeb534cfb65a841a892;hp=82ac0069b95d4f22e3d0de1ab0c0b66b04c76423;hpb=27630d44298cb67e075c166f4421288cc8ca117e;p=libs%2Fdatafile.git diff --git a/source/parser.cpp b/source/parser.cpp index 82ac006..6166e56 100644 --- a/source/parser.cpp +++ b/source/parser.cpp @@ -1,12 +1,6 @@ -/* $Id$ - -This file is part of libmspdatafile -Copyright © 2006 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ -#include -#include +#include #include "binaryparser.h" +#include "dataerror.h" #include "parser.h" #include "statement.h" #include "textparser.h" @@ -16,8 +10,9 @@ using namespace std; namespace Msp { namespace DataFile { -Parser::Parser(istream &i, const string &s): +Parser::Parser(IO::Base &i, const string &s): in(i), + main_src(s), src(s), good(true), mode(new TextParser(in, src)) @@ -28,35 +23,64 @@ Parser::~Parser() delete mode; } -Statement Parser::parse() +Statement Parser::parse(bool raw) { if(!good) - throw Exception("Parser is not good"); + throw logic_error("Parser::parse() !good"); try { while(1) { - Statement st=mode->parse(); - 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(raw || !st.control) return st; + else if(!good) // This will occur with an __end statement + return Statement(); } } - catch(const Exception &e) + catch(const exception &e) + { + good = false; + if(dynamic_cast(&e)) + throw; + else + throw data_error(src, in.get_line_number(), e); + } +} + +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") { - good=false; - throw; + 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