]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/binaryparser.cpp
Add reverse name lookup to Collection
[libs/datafile.git] / source / binaryparser.cpp
index b55c7af3e1a8c76bc8f6c2c0855a4cea6fea7e17..214c35e70d3793437e786f90d0f99fd60a1fbd66 100644 (file)
@@ -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,7 +28,7 @@ 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");
@@ -38,13 +38,13 @@ Statement BinaryParser::parse()
                        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 TypeError(src+": String definition must have two arguments");
 
                        const unsigned id=st.args[0].get<unsigned>();
-                       enums[id]=st.args[1].get<const std::string &>();
+                       strings[id]=st.args[1].get<const string &>();
                }
                else
                        return st;
@@ -117,7 +117,7 @@ long long BinaryParser::parse_int()
                        break;
        }
 
-       const long long mask=1<<(bits-1);
+       const long long mask=1LL<<(bits-1);
        result=(result^mask)-mask;
 
        return result;
@@ -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 KeyError("Unknown string", lexical_cast(id));
        return i->second;
 }