X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbinaryparser.cpp;h=40736896c01bf13aaa789b2033050cbda5b338fc;hb=256f7238bc60d6dcc31a564988f5cc02a60c4537;hp=6aed5b1590bb93b383fb45c535a6cd75af94a030;hpb=505042fcda16151f5ace243c243d34af3efcf677;p=libs%2Fdatafile.git diff --git a/source/binaryparser.cpp b/source/binaryparser.cpp index 6aed5b1..4073689 100644 --- a/source/binaryparser.cpp +++ b/source/binaryparser.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of libmspdatafile -Copyright © 2007 Mikko Rasa, Mikkosoft Productions +Copyright © 2007-2008 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ @@ -19,8 +19,8 @@ BinaryParser::BinaryParser(Input &i, const string &s): ParserMode(i, s), first(true) { - dict[1]=DictEntry("__st", "iss"); - dict[2]=DictEntry("__enum", "is"); + dict[1]=DictEntry("__kwd", "iss"); + dict[2]=DictEntry("__str", "is"); } Statement BinaryParser::parse() @@ -28,23 +28,23 @@ Statement BinaryParser::parse() while(1) { Statement st=parse_statement(); - if(st.keyword=="__st") + if(st.keyword=="__kwd") { if(st.args.size()!=3) - throw TypeError(src+": Keyword definition must have three arguments"); + throw_at(TypeError("Keyword definition must have three arguments"), src); const unsigned id=st.args[0].get(); const string &kw=st.args[1].get(); const string &args=st.args[2].get(); dict[id]=DictEntry(kw, args); } - else if(st.keyword=="__enum") + else if(st.keyword=="__str") { if(st.args.size()!=2) - throw TypeError(src+": Enum definition must have three arguments"); + throw_at(TypeError("String definition must have two arguments"), src); const unsigned id=st.args[0].get(); - enums[id]=st.args[1].get(); + strings[id]=st.args[1].get(); } else return st; @@ -63,7 +63,7 @@ Statement BinaryParser::parse_statement() Dictionary::const_iterator i=dict.find(id); if(i==dict.end()) - throw ParseError(format("%s: Unknown statement ID %d", src, id), src, 0); + throw_at(KeyError("Unknown statement ID", lexical_cast(id)), src); const DictEntry &de=i->second; Statement result; @@ -87,7 +87,7 @@ Statement BinaryParser::parse_statement() result.args.push_back(parse_bool()); break; case 'e': - result.args.push_back(parse_enum()); + result.args.push_back(Value(ENUM, parse_enum())); break; } } @@ -110,14 +110,14 @@ long long BinaryParser::parse_int() { int c=in.get(); - result=result<<7 | c&0x7F; + result=(result<<7) | (c&0x7F); bits+=7; if(!(c&0x80)) break; } - const long long mask=1<<(bits-1); + const long long mask=1LL<<(bits-1); result=(result^mask)-mask; return result; @@ -132,7 +132,7 @@ float BinaryParser::parse_float() }; #if BYTE_ORDER == LITTLE_ENDIAN - for(unsigned i=sizeof(float)-1; i--;) + for(unsigned i=sizeof(float); i--;) d[i]=in.get(); #else for(unsigned i=0; i=0) + { + string result; + result.reserve(len); + for(int i=0; isecond; }