-/* $Id$
-
-This file is part of libmspdatafile
-Copyright © 2006 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-#include <msp/strings/formatter.h>
+#include <msp/strings/format.h>
#include "binaryparser.h"
+#include "dataerror.h"
#include "parser.h"
#include "statement.h"
#include "textparser.h"
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();
+ Statement st = mode->parse(raw);
if(st.keyword=="__bin")
{
delete mode;
- mode=new BinaryParser(in, src);
+ mode = new BinaryParser(in, src);
}
else if(st.keyword=="__text")
{
delete mode;
- mode=new TextParser(in, src);
+ 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>();
+ string s = st.args[0].get<string>();
if(s.empty())
- src=main_src;
+ src = main_src;
else
- src=format("%s[%s]", main_src, s);
+ src = format("%s[%s]", main_src, s);
+ }
+ else if(st.keyword=="__end")
+ {
+ good = false;
+ return raw ? st : Statement();
}
else
return st;
+
+ if(raw)
+ return st;
}
}
- catch(const Exception &e)
+ catch(const exception &e)
{
- good=false;
- throw;
+ good = false;
+ if(dynamic_cast<const data_error *>(&e))
+ throw;
+ else
+ throw data_error(src, in.get_line_number(), e);
}
}