X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbinaryparser.cpp;h=81a86ea9a3b66b7ae9c9a6ba0a3dfff4f134ff17;hb=e0af585ed57bdb5b1ea4f4a415fda13b5d99d2dc;hp=d2fca32ef3a2155eb78eec3034e67649336c3c0f;hpb=35d0da96bad97214376f18d15078e6d731e6f219;p=libs%2Fdatafile.git diff --git a/source/binaryparser.cpp b/source/binaryparser.cpp index d2fca32..81a86ea 100644 --- a/source/binaryparser.cpp +++ b/source/binaryparser.cpp @@ -9,12 +9,23 @@ using namespace std; namespace Msp { namespace DataFile { +class bad_definition: public runtime_error +{ +public: + bad_definition(const std::string &w): + runtime_error(w) + { } + + virtual ~bad_definition() throw() { } +}; + + BinaryParser::BinaryParser(Input &i, const string &s): ParserMode(i, s), first(true) { - dict[1] = DictEntry("__kwd", "iss"); - dict[2] = DictEntry("__str", "is"); + dict[-1] = DictEntry("__kwd", "iss"); + dict[-2] = DictEntry("__str", "is"); } Statement BinaryParser::parse() @@ -25,9 +36,9 @@ Statement BinaryParser::parse() if(st.keyword=="__kwd") { if(st.args.size()!=3) - throw_at(TypeError("Keyword definition must have three arguments"), src); + throw bad_definition("__kwd"); - const unsigned id = st.args[0].get(); + const int id = st.args[0].get(); const string &kw = st.args[1].get(); const string &args = st.args[2].get(); dict[id] = DictEntry(kw, args); @@ -35,7 +46,7 @@ Statement BinaryParser::parse() else if(st.keyword=="__str") { if(st.args.size()!=2) - throw_at(TypeError("String definition must have two arguments"), src); + throw bad_definition("__str"); const unsigned id = st.args[0].get(); strings[id] = st.args[1].get(); @@ -51,7 +62,7 @@ Statement BinaryParser::parse_statement() in.get(); first = false; - unsigned id = parse_int(); + int id = parse_int(); if(!in) return Statement(); @@ -78,7 +89,7 @@ Statement BinaryParser::parse_statement() result.args.push_back(parse_bool()); break; case SymbolType::signature: - result.args.push_back(Symbol(parse_enum())); + result.args.push_back(parse_symbol()); break; } } @@ -92,9 +103,9 @@ Statement BinaryParser::parse_statement() return result; } -long long BinaryParser::parse_int() +IntType::Store BinaryParser::parse_int() { - long long result = 0; + IntType::Store result = 0; unsigned bits = 0; while(in) @@ -108,13 +119,13 @@ long long BinaryParser::parse_int() break; } - const long long mask = 1LL<<(bits-1); + const IntType::Store mask = 1LL<<(bits-1); result = (result^mask)-mask; return result; } -float BinaryParser::parse_float() +FloatType::Store BinaryParser::parse_float() { union { @@ -133,12 +144,12 @@ float BinaryParser::parse_float() return f; } -bool BinaryParser::parse_bool() +BoolType::Store BinaryParser::parse_bool() { return in.get(); } -string BinaryParser::parse_string() +StringType::Store BinaryParser::parse_string() { int len = parse_int(); if(len>=0) @@ -153,7 +164,7 @@ string BinaryParser::parse_string() return get_item(strings, -len); } -string BinaryParser::parse_enum() +SymbolType::Store BinaryParser::parse_symbol() { return get_item(strings, parse_int()); }