]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/binaryparser.cpp
Style update: add spaces around assignments
[libs/datafile.git] / source / binaryparser.cpp
index ba6414bc77a369a7eb2d7c51e06e412aee16fb0a..ed1d71c8b197db64366e5e858b35ff032bc9b8df 100644 (file)
@@ -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,32 +19,32 @@ 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()
 {
        while(1)
        {
-               Statement st=parse_statement();
-               if(st.keyword=="__st")
+               Statement st = parse_statement();
+               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<unsigned>();
-                       const string &kw=st.args[1].get<const string &>();
-                       const string &args=st.args[2].get<const string &>();
-                       dict[id]=DictEntry(kw, args);
+                       const unsigned id = st.args[0].get<unsigned>();
+                       const string &kw = st.args[1].get<const string &>();
+                       const string &args = st.args[2].get<const string &>();
+                       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<unsigned>();
-                       enums[id]=st.args[1].get<const std::string &>();
+                       const unsigned id = st.args[0].get<unsigned>();
+                       strings[id] = st.args[1].get<const string &>();
                }
                else
                        return st;
@@ -55,22 +55,22 @@ Statement BinaryParser::parse_statement()
 {
        while(first && in.peek()=='\n')
                in.get();
-       first=false;
+       first = false;
 
-       unsigned id=parse_int();
+       unsigned id = parse_int();
        if(!in)
                return Statement();
 
-       Dictionary::const_iterator i=dict.find(id);
+       Dictionary::const_iterator i = dict.find(id);
        if(i==dict.end())
-               throw ParseError(format("%s: Unknown statement ID %d", src, id), src, 0);
-       const DictEntry &de=i->second;
+               throw_at(KeyError("Unknown statement ID", lexical_cast(id)), src);
+       const DictEntry &de = i->second;
 
        Statement result;
-       result.keyword=de.keyword;
-       result.source=src;
+       result.keyword = de.keyword;
+       result.source = src;
 
-       for(unsigned j=0; j<de.args.size(); ++j)
+       for(unsigned j = 0; j<de.args.size(); ++j)
        {
                switch(de.args[j])
                {
@@ -92,33 +92,33 @@ Statement BinaryParser::parse_statement()
                }
        }
 
-       unsigned nsub=parse_int();
-       for(unsigned j=0; j<nsub; ++j)
+       unsigned nsub = parse_int();
+       for(unsigned j = 0; j<nsub; ++j)
                result.sub.push_back(parse());
 
-       result.valid=true;
+       result.valid = true;
 
        return result;
 }
 
 long long BinaryParser::parse_int()
 {
-       long long result=0;
-       unsigned bits=0;
+       long long result = 0;
+       unsigned bits = 0;
 
        while(in)
        {
-               int c=in.get();
+               int c = in.get();
 
-               result=result<<7 | c&0x7F;
-               bits+=7;
+               result = (result<<7) | (c&0x7F);
+               bits += 7;
 
                if(!(c&0x80))
                        break;
        }
 
-       const long long mask=1<<(bits-1);
-       result=(result^mask)-mask;
+       const long long mask = 1LL<<(bits-1);
+       result = (result^mask)-mask;
 
        return result;
 }
@@ -132,11 +132,11 @@ float BinaryParser::parse_float()
        };
 
 #if BYTE_ORDER == LITTLE_ENDIAN
-       for(unsigned i=sizeof(float); i--;)
-               d[i]=in.get();
+       for(unsigned i = sizeof(float); i--;)
+               d[i] = in.get();
 #else
-       for(unsigned i=0; i<sizeof(float); ++i)
-               d[i]=in.get();
+       for(unsigned i = 0; i<sizeof(float); ++i)
+               d[i] = in.get();
 #endif
 
        return f;
@@ -149,20 +149,29 @@ bool BinaryParser::parse_bool()
 
 string BinaryParser::parse_string()
 {
-       unsigned len=parse_int();
-       string result;
-       result.reserve(len);
-       for(unsigned i=0; i<len; ++i)
-               result+=in.get();
-       return result;
+       int len = parse_int();
+       if(len>=0)
+       {
+               string result;
+               result.reserve(len);
+               for(int i = 0; i<len; ++i)
+                       result += in.get();
+               return result;
+       }
+       else
+               return lookup_string(-len);
 }
 
 string BinaryParser::parse_enum()
 {
-       unsigned id=parse_int();
-       EnumMap::iterator i=enums.find(id);
-       if(i==enums.end())
-               throw KeyError("Unknown enum", lexical_cast(id));
+       return lookup_string(parse_int());
+}
+
+const string &BinaryParser::lookup_string(unsigned id) const
+{
+       StringMap::const_iterator i = strings.find(id);
+       if(i==strings.end())
+               throw_at(KeyError("Unknown string", lexical_cast(id)), src);
        return i->second;
 }